Compare commits

..
Author SHA1 Message Date
Milan Hanajik 80697ed65f ver. 2.12.550 2017-04-24 14:22:51 +02:00
Milan Hanajik 43fd99cea6 output.FileWriter.Enhanced copes with WaterMeters.Count==0, etc. 2017-04-24 12:21:12 +02:00
Milan Hanajik eafcf016f3 Setting regulation valves before flow setting disabled, caused porbles all the time, ver. 2.12 549 2017-04-24 11:58:57 +02:00
Milan Hanajik 5a89a5d43f ver. 2.12.548 2017-04-24 11:02:12 +02:00
Milan Hanajik 33715395dc ReadMassOp fixed, was freezing when draining tanks, ver. 2.12.547 2017-04-24 10:49:28 +02:00
Milan Hanajik 05982cc2ff Endurance test method sequence modified. 2017-04-24 09:44:11 +02:00
Milan Hanajik 6706b296c0 ver. 2.12.546 2017-04-24 08:29:51 +02:00
Milan Hanajik e4be90b7bc ver. 2.12.545 2017-04-20 15:59:35 +02:00
Milan Hanajik 9cc9e4b4c9 MainSeq change to Restore a previously saved batch results, ver. 2.12.544 2017-04-20 15:53:11 +02:00
Milan Hanajik 45869401ad BatchNr of restored session fixed, ver. 2.12.544 2017-04-20 11:00:41 +02:00
Milan Hanajik 5a88e8909f Culture parameter added to all Output.FileWriters components, ver. 2.12.543 2017-04-18 15:29:28 +02:00
Milan Hanajik a4dc7435d0 PreviousResultsCtrl modification: Reload/Restore button was hidden. 2017-04-14 11:51:37 +02:00
Milan Hanajik df1689d458 MainSeq changes, CopyContentFrom() added to WaterMeter, TestRslt, MeterTestRslt, ver. 2.12.542 2017-04-13 14:34:58 +02:00
Milan Hanajik 76a54f41a7 Results.DBase added. 2017-04-12 21:43:57 +02:00
Milan Hanajik 89593b1dac 'Custom'/'Oprav DEWY' button added to BenchControlPanel, MainSeq changes 2017-04-12 17:59:48 +02:00
Milan Hanajik dbd6b7a9f7 SeqBase bug fixes. 2017-04-12 17:37:55 +02:00
Milan Hanajik e49fcdebfc ver. 2.12.539 2017-04-11 17:37:04 +02:00
Milan Hanajik 1ccdcf9bd2 Possibility to reload previous results, MainSeq modified - CreateNewBatchResults() and RestoreBatchResults(), ver. 2.12.538 2017-04-11 17:31:48 +02:00
Milan Hanajik 60f5359bd9 Culture invariant procedure import/export, ver. 2.12.537 2017-04-11 12:54:37 +02:00
Milan Hanajik 71cc77bee1 Keithley.Multimeter_2010_RS232.Multimeter shut-down bug fix, ver. 2.12.536 2017-04-10 15:06:56 +02:00
Milan Hanajik 460b40c9cd ver. 2.12.535 2017-04-10 12:04:04 +02:00
Milan Hanajik c2e32c774e RoiDetecion wizard forms added to TestWizard, ver. 2.12.534 2017-04-10 11:53:41 +02:00
Milan Hanajik 796d9fa554 Camera.Display.DisplayForm modifications 2017-04-09 14:10:49 +02:00
Milan Hanajik 8a8c6c9997 Camera measurement speed optimized, ver. 2.12.533 2017-04-09 13:30:30 +02:00
Milan Hanajik 6e420250b4 Possibility to switch off Telnet VirtualTerminal completely, IVirtualTerminal, DummyVT. 2017-04-07 16:04:43 +02:00
Milan Hanajik 4564f0424c Camera ; UDP listener implemented (but disabled) again, ver. 2.12.532 2017-04-07 15:49:14 +02:00
Milan Hanajik 099d635d3e RoiParams, DetectionImagesCount, P1, P2 are procedure parameters, ver. 2.12.531 2017-04-07 12:22:01 +02:00
Milan Hanajik d372a38e7d Camera time read with each sample, calculation : VolumeStart, VolumeEnd, TimestampStart, TimestampEnd used, ver. 2.12.530 2017-04-07 11:29:35 +02:00
Milan Hanajik fc26b95bdb RoiCfg.SaveImages introduced, Program.ImagesDir introduced - directory cleaned or created on program startup. 2017-04-06 23:49:51 +02:00
Milan Hanajik 44735260ce CLP1611 Measurement done only on successfully detected ROI-s, ver. 2.12.530 2017-04-06 23:47:24 +02:00
Milan Hanajik 6aa3cd96a6 RoiDetection : Changes while testing, ver. 2.12.528 2017-04-06 18:00:33 +02:00
Milan Hanajik e1eb582804 RoiDetection : Images/cameras for retry of ROI Detection can be selected, ver. 2.12.527 2017-04-06 16:54:27 +02:00
Milan Hanajik 0ad4847972 Network.Camera.Display and ICameraDisplay added, ver. 2.12.526 2017-04-06 15:17:56 +02:00
Milan Hanajik 323f2ede25 RoiDetectionOp modified : File transfer correctly initiated. 2017-04-06 10:27:21 +02:00
Milan Hanajik a64c547395 Output.FileWriters.Xml modifications, ver. 2.12.525 2017-04-06 08:29:03 +02:00
Milan Hanajik 40f5079846 MeasurementOp.cs deleted, MeasurementOp in Network/Camera/CLP1611/Camera.cs 2017-04-05 22:22:41 +02:00
Milan Hanajik 464dfc6dd1 FlyingStartMassCollection : 'Next' button can be used to stop the test. 2017-04-05 22:01:21 +02:00
Milan Hanajik c1b3cdde6d Camera bug fix 2017-04-05 22:00:01 +02:00
Milan Hanajik e688c4ba25 Speisung -> Wasserzulauf 2017-04-05 20:32:39 +02:00
Milan Hanajik 592823aa10 Program shutdown cleaned-up : StopOperations(), StopDevice() called appropriately. 2017-04-05 19:45:21 +02:00
Milan Hanajik 5ad871a7e0 Procedure 'Export' / 'Import' implemented, ver. 2.12.524 2017-04-03 14:24:35 +02:00
Milan Hanajik 049bbc8655 DEWA Q2 correction modified, Results.Entities.WaterMeter columns added (iPerl only). 2017-03-31 14:17:18 +02:00
Milan Hanajik dcf6df293f Changes agreed with Mr. Kolesnik in BWB, ver. 2.12.521 2017-03-30 12:38:50 +02:00
Milan Hanajik 0dd2245fe6 Berlin component upgraded 2017-03-29 12:45:14 +02:00
Milan Hanajik cd750cca2f Bug in DataEntry.Standard6.CycleEndForm fixed (end states, Berlin), ver. 2.12.520 2017-03-29 11:54:07 +02:00
Milan Hanajik 5f2da63339 Drain valve removed from Output path, outPath.Scale.DrainValve used instead of outPath.DrainValve, wait for Event. BalanceDone before 2nd mass measurement in FlyingStartMassCollection, ver. 2.12.519 2017-03-29 09:22:39 +02:00
Milan Hanajik d420128b4b Draining modified, in BERLIN done always before flow setting, ver. 2.12.518 2017-03-28 23:54:52 +02:00
Milan Hanajik 2ca5eec8e1 MassMethod : bool -> enum 2017-03-28 21:46:38 +02:00
Milan Hanajik 214a570ca6 Drain valves are specified as component parameters, tank draining on startup fixed, WaitTankEmptyOp, basic TankDraining management, etc, ver. 2.12.517 2017-03-28 12:50:09 +02:00
Milan Hanajik 8fb021da4c Draining management under construction 2017-03-27 23:05:02 +02:00
Milan Hanajik 439d98f99d ReadStableMassOp uses MassRepeats, MassSpread and MassMethod parameters, ver. 2.12.515 2017-03-27 18:32:28 +02:00
Milan Hanajik 3c4fe34c1d Test_volume_exceeds_the_scale_capacity situation handled correctly, no Error state. 2017-03-27 14:08:53 +02:00
Milan Hanajik 641353585c ResultsBrowser : Crash when using statistics for the first time on a new PC fixed, ver. 2.12.514 2017-03-27 12:35:17 +02:00
Milan Hanajik de9a47c2a1 Watermeter supports old and new Q names, Break button visible in German versions. 2017-03-27 11:51:11 +02:00
Milan Hanajik e902dd7c07 Results screen : 'Previous resuts' button always visible, ver.2.12.514 2017-03-27 10:37:59 +02:00
Milan Hanajik ac7076ee0f ver. 2.12.513 2017-03-27 09:15:50 +02:00
Milan Hanajik b5f218b657 OptoTelegramRaw simplified, ver. 2.12.512 2017-03-25 17:31:54 +01:00
Milan Hanajik c468854a76 ver. 2.12.511 2017-03-24 15:38:26 +01:00
Milan Hanajik 1037a68d96 Saving to Oracle DB bug fix, Opto-data processing bug fix, ver. 2.12.510 2017-03-24 15:31:50 +01:00
Milan Hanajik 9e84d894a7 ver. 2.12.507 2017-03-23 08:52:24 +01:00
Milan Hanajik dbbe11cbbc ver. 2.12.506 2017-03-22 14:03:13 +01:00
Milan Hanajik 8d287351b7 Saving to Oracle DB uses a list of tests extracted from VT_PRUEFPUNKT_SOLL_SD, required for DEWA water meters, ver. 2.12.505 2017-03-22 13:59:21 +01:00
Milan Hanajik 724869948f Coping with overflows in OptoData fixed (volume, timestamp). 2017-03-20 22:05:43 +01:00
Milan Hanajik 0497693968 Bug fix in UI when copying ListViewEx cell data into cels in the column below by the right-click, ver. 2.12.503 2017-03-20 21:28:47 +01:00
Milan Hanajik de90477276 ver. 2.12.502 2017-03-20 17:48:44 +01:00
Milan Hanajik 8d4af6f347 Bug in iPerl IRegisterReader usage by FlyingStartMassCollectionSeq fixed, ver. 2.12.501 2017-03-20 17:44:28 +01:00
Milan Hanajik 64cb33cdfd ver. 2.12.500 2017-03-20 13:43:57 +01:00
Milan Hanajik 042488ba79 try-catch when copying remote users to the local database, ver. 2.12.499 2017-03-20 09:14:00 +01:00
Milan Hanajik cd50494141 TestMethods.iPerlCommunication.iPerlCommunicationForm.WriteQ2CorrectionAlt() added. 2017-03-19 22:03:31 +01:00
Milan Hanajik f12b2c38f7 Logging well tested, fixed no 'remote' user DB, way of authorization indicated, copy all remote users, etc., ver. 2.12.498 2017-03-19 18:53:07 +01:00
Milan Hanajik dbfc06960f Invalid components are displayed in ComponentsManagerDlg (up/down bug fixed), etc. 2017-03-18 16:46:03 +01:00
Milan Hanajik 861aae753e User Management cleanup, bool showLocalExtensions added, UserManagement use from TBF fixed. 2017-03-17 13:03:20 +01:00
Milan Hanajik ccf99a3105 User number added to EditSelectedUser form. 2017-03-17 09:45:39 +01:00
Milan Hanajik e245ec80c6 Many changes, Config depends on Users, not vice versa. 2017-03-16 21:53:12 +01:00
Milan Hanajik 7564ed7ba6 UserManagement.DatabaseSettingsDlg and LocalSettings added 2017-03-16 11:09:38 +01:00
Milan Hanajik 721bfdf5c8 Users.Forms.EditUsers --> Users.Forms.UserManagementDlg 2017-03-15 13:52:44 +01:00
Milan Hanajik f3d9fdca7f UserManagement project added 2017-03-15 13:31:33 +01:00
Milan Hanajik 2b78f46efe gitignore and clean.bat changed - UserManagement 2017-03-15 13:31:19 +01:00
Milan Hanajik 77555aeebf 'EditUsers', 'EditSelectedUser' and 'LoginDlg' moved to 'Users' library 2017-03-15 12:56:53 +01:00
Milan Hanajik 58d34023b7 'Repeat password' field added, entered passwords are verified. 2017-03-15 08:11:54 +01:00
Milan Hanajik 42ac833091 All Output.FileWriters.* : Writing to files done in separate threads. 2017-03-15 07:37:42 +01:00
Milan Hanajik 94eb2909bc Oracle database selection includes 'None', component Simulate mode not required anymore, ver. 2.12.497 2017-03-14 13:31:03 +01:00
Milan Hanajik c46dea3ae7 ver. 2.12.496 2017-03-14 09:46:43 +01:00
Milan Hanajik 3160bfd43c TaskSelector State initialization : digital inputs read 3s after start-up, SelectTankOp fixed, ver. 2.12.495 2017-03-10 21:15:25 +01:00
Milan Hanajik e1f54cc49f Gnesis component updated 2017-03-10 17:06:18 +01:00
Milan Hanajik 8b297ba8a6 TankSelector reads CB digital inputs, detemines initial state and detects NoTankSelected, ver. 2.12.493 2017-03-10 16:55:36 +01:00
Milan Hanajik dcca6d9215 'NoStartEnd' DataEntry components added, ready to test FixedStartStopMethod with pulses. 2017-03-10 14:59:29 +01:00
Milan Hanajik 0d2099af10 IRegisterReader includes BeginWMState and EndWMState (both double). DataEnty.WMStartState and WMEndState are also double. 2017-03-10 14:31:08 +01:00
Milan Hanajik ff4dcc39db Component updated - displays pump power in %, crash when closing opto-serial port avoided, etc., ver. 2.12.492 2017-03-10 13:47:23 +01:00
Milan Hanajik 87bc0131cf Tests when test volume exceeds the tank capacity cannot be executed, an error message appears. 2017-03-10 13:10:57 +01:00
Milan Hanajik 20fce538de More TankSelector modifications, ver. 2.12.491 2017-03-10 12:54:18 +01:00
Milan Hanajik d2bed417f1 Emergency stop invokes STOP button press in BenchControlPanel. 2017-03-10 09:50:20 +01:00
Milan Hanajik 8d572a650a (1) Easytherm: proc. params, (2) TankSelector: no. proc. params, seq. conditions added., SetQuidoBitOp, SelectTankOp, UnselectTankOp, ver. 2.12.490 2017-03-09 21:36:44 +01:00
Milan Hanajik efc3efcbfb Munich : 'Drucker' removed from ProcedureDlg ... Process parameters controls 2017-03-09 16:38:59 +01:00
Milan Hanajik 56f8d64fc8 AskYesNoForm, AskYesNoOp, MessageBoxForm and MessageBoxOp fixed, bug was introduced when measuring the string length. 2017-03-09 15:24:10 +01:00
Milan Hanajik e93a817d4d Balance crash on program shut-down avoided. 2017-03-09 15:03:42 +01:00
Milan Hanajik f9c8c22d5e Tank selector: (1) temperature controllers added, (2) procedure parameters added, ver. 2.12.489 2017-03-09 15:03:31 +01:00
Milan Hanajik e423562806 Genesis : Well separated iPerl and Oracle DB support, ver. 2.12.487 2017-03-09 13:12:32 +01:00
Milan Hanajik aa47ce24f4 Modbus Easytherm modifications, SetTemperature works OK, ver. 2.12.487 2017-03-09 07:54:51 +01:00
Milan Hanajik 3c51b92e5e Serious bug in saving/printing results for compound meters fixed, ver. 2.12.486 2017-03-08 10:35:08 +01:00
Milan Hanajik 697b0b3538 Munich : ResultsBrowser prints the bench name, ver. 2.12.485 2017-03-08 07:26:03 +01:00
Milan Hanajik 08b47776ec German only text when a camera was not detected on startup. 2017-03-08 06:52:18 +01:00
Milan Hanajik 0370d1f582 TestStartEndForm (and IHasWMStatesForm interface) added to DataEntry.Munich3 2017-03-07 19:01:49 +01:00
Milan Hanajik fa5b427d4d Simulated mode for FixedStartMassCollection method, Bug fix in DataEntry.Standard6.TestStartEndForm, ver. 2.12.485 2017-03-07 19:00:36 +01:00
Milan Hanajik 21102bb991 Compound meter result items added, ver. 2.12.484 2017-03-07 11:53:29 +01:00
Milan Hanajik b00b6e8412 Munich : Printer clean-up and fixes, ver. 2.12.483 2017-03-07 09:45:00 +01:00
Milan Hanajik 5b4a9c0129 Network.Camera.CLP1611 : IP address can be specified. 2017-03-06 13:21:10 +01:00
Milan Hanajik dc2b945230 Some progress on Easytherm communication. 2017-03-06 00:33:44 +01:00
Milan Hanajik 9ff58c9e0b ver. 2.12.482 2017-03-02 14:12:14 +01:00
Milan Hanajik df0a38e3c6 MettlerToledo.TankDraining, ITankDrainingCfg, ITankDraining class/interfaces added, EmptyValve --> DrainValve 2017-03-02 09:17:22 +01:00
Milan Hanajik 33b349e333 ComponentsManagerDlg : Up and down button implemented. 2017-02-28 22:39:56 +01:00
Milan Hanajik ab14866575 'AskYesNoForm' and 'MessageBoxForm' widths are calculated from the text width. 2017-02-28 13:50:17 +01:00
Milan Hanajik 0f6a3ffa80 Width of the form with "Test bench framework program is closing" is calculated from the text width. 2017-02-28 13:49:18 +01:00
Milan Hanajik fde4b8b16f Resources cleanup 2017-02-28 12:35:41 +01:00
Milan Hanajik c450eaf339 Logging into TBF program in case central users server is not running (and login fails) is fixed, ver. 2.12.481 2017-02-28 11:09:09 +01:00
Milan Hanajik 30819bbacd Output.FileWriters.Enhanced : Bug fix for Badger Meter, ver. 2.12.479 2017-02-22 20:39:22 +01:00
Milan Hanajik fce6e65218 ResultsBrowser released, ver. 2.12.478 2017-02-22 20:24:01 +01:00
Milan Hanajik 9550f97f8e Badger specific modification of Output.FileWriters.Enhanced, ver. 2.12.478 2017-02-22 19:25:41 +01:00
Milan Hanajik bb9c2b13e5 Badger : More logging in RegisterReader,ver. 2.12.477 2017-02-22 18:26:16 +01:00
Milan Hanajik aafcf77004 Output.FileWriters.Enhanced and Output.FileWriters.Xml fixed, ver. 2.12.476 2017-02-22 16:32:19 +01:00
Milan Hanajik 89c9e69a03 ToolTips temporarily disabled. 2017-02-22 14:49:23 +01:00
Milan Hanajik 6a072b7814 ResultsConfigDlg modifications : TabControl with three TreeViews, ver. 2.12.475 2017-02-22 14:07:20 +01:00
Milan Hanajik 4515f0fc13 FlyingStartMassCollectionSeq modified : Valves/pumps are closed immediately after the test only when there are no subsequent test repeats. 2017-02-21 10:45:26 +01:00
Milan Hanajik e7723c108d Bug fix : iPerl RFID comm. evaluation in case RegisterReaders are not complete fixed, ver. 2.12.475 2017-02-21 10:33:08 +01:00
Milan Hanajik 970fc886c6 FlyingStartMassCollectionSeq : If transitionAfter is not used, the valves/pumps are closed immediately after the test before the 2nd mass measurement, ver. 2.12.472 2017-02-17 10:51:30 +01:00
Milan Hanajik 7b093a5623 MettlerToledo..BalanceNewDev : Scale 'overload' does not update 'mass' and static 'Masses[balanceNr]' variables, ver. 2.12 471 2017-02-17 10:11:34 +01:00
Milan Hanajik 9a2e7ea72b Network.Camera.CLP1611.GrabImageOp added. 2017-02-17 08:50:19 +01:00
Milan Hanajik 8b188c9c75 LiveStreamOp : VLC start modified. 2017-02-16 21:38:01 +01:00
Milan Hanajik 4aed5c15a0 Network.Camera.CLP1611.LiveStreamOp added, ver. 2.12.470 2017-02-16 18:45:30 +01:00
Milan Hanajik 305d99d654 WinSCP image transfer integrated into Network.CLP1611.Camera and Roi detection. 2017-02-16 14:57:37 +01:00
Milan Hanajik 1029308b2c Network.Telnet and Network.CLP1611.Camera : Skip the first line in the VT terminal when logging on, ver. 2.12.468 2017-02-16 11:42:15 +01:00
Milan Hanajik 463e3fd0aa MettlerToledo.all and Ambient.Comet : Fixed bugs in serial port handling when closing the program, ver. 2.12.467 2017-02-16 09:55:49 +01:00
Milan Hanajik 3ee6e16592 Output.FileWriters.Xml component for BWB added. 2017-02-16 09:15:44 +01:00
Milan Hanajik 2b7ad1ef7d Output.FileWriters.Enhanced : (1) Old style ResultsConfigDlg removed, (2) Configuration change handling, ver. 2 12.466 2017-02-16 09:15:35 +01:00
Milan Hanajik 4c66ba4038 German 2017-02-16 09:15:24 +01:00
Milan Hanajik eb1ff6ddda ver. 2.12.465 2017-02-15 12:36:11 +01:00
Milan Hanajik ff837fc076 ver. 2.12.464 2017-02-15 12:14:33 +01:00
Milan Hanajik 5cbddcaaf4 Results.WMeterRsltItemSpec bug fix : Serialization in ToStrArray() and FromStrArray() was not language independent. 2017-02-15 11:48:47 +01:00
Milan Hanajik 24884de4e4 German translations I. 2017-02-15 10:58:43 +01:00
Milan Hanajik efc4668200 Only relevant units are displayed by ComboBox when using ResultsConfigDlg 2017-02-15 10:57:37 +01:00
Milan Hanajik a90ba0c546 Camera.CLP1611: (1) 'AutoDetect' feature works OK, (2) UI: TestImagesCount value not checked when UseTestImages=false, ver. 2.12.463 2017-02-14 16:49:59 +01:00
Milan Hanajik d039df5361 (1) iPerl RFID comm. evaluation in case RegisterReaders are not complete fixed
(2) Procedure copy UI bug fixed
(3) Genesis : A bug when using TankSelector via Modbus and closing the program fixed.
2017-02-14 15:52:44 +01:00
Milan Hanajik 8d4910fcb0 Symbols: introduced IPERL, ORACLE_DB, HEAT_METERS, TURA_IPERL, TURA_SPECIAL
abandoned IPERLST, IPERLSTSPECIAL, HEAT_METERS_SUPPORT
2017-02-14 13:42:22 +01:00
Milan Hanajik f30d785fb3 TankSelector.SelectTankOp added, TransitionStep: StepCondition EndCondition --> string EndCondition, etc. 2017-02-11 22:32:43 +01:00
Milan Hanajik efdd138379 DigitalInputs uint --> ulong 2017-02-11 10:12:10 +01:00
Milan Hanajik 115f83aeb0 ISequenceCondition interface added 2017-02-11 09:11:11 +01:00
Milan Hanajik b93eaadfc2 Compound meters : Process screens '24' and '48' modified as well, ver. 2.12.460 2017-02-10 18:29:07 +01:00
Milan Hanajik 1233f17dc4 Genesis : Process screen '6' for compound meters fixed, ver. 2.12.459 2017-02-10 18:12:22 +01:00
Milan Hanajik 2a2dbcca83 Genesis : Component upgraded, more logging in registerReader, ver. 2.12.458 2017-02-10 17:47:39 +01:00
Milan Hanajik e9070e5cc3 Modbus.Easytherm component added, QuidoRS.TankSelector --> TankSelector, ver. 2.12.457 2017-02-10 14:29:15 +01:00
Milan Hanajik 7319a9aee4 MassStart, MassEnd added to (old) results items, ver. 2.12.456 2017-02-10 10:20:07 +01:00
Milan Hanajik 93513100eb QuidoRS : Watchdog is optional, configurable, ver. 2 12.455 2017-02-09 20:59:00 +01:00
Milan Hanajik 46cc618300 TankSelector component added 2017-02-09 20:58:04 +01:00
Milan Hanajik 7ac1f2d431 Genesis specific changes, error messages fixed, smalled branch scale fixed, ver.2.12.455 2017-02-09 12:34:36 +01:00
Milan Hanajik d96f124bb3 IPAddress and TcpipPortNr added to WaterMeters.iPerl configuration and UI. 2017-02-06 18:34:32 +01:00
Milan Hanajik 3fd56531da (1) Genesis component upgraded, (2) FixedStartMassCollectionSeq : Opening start/stop valve in 2nd repetition fixed, ver. 2.12.453 2017-02-06 17:44:13 +01:00
Milan Hanajik 83fa635ee9 Polish resources dated 31.01.2017 imported into solution. 2017-02-06 17:25:17 +01:00
Milan Hanajik be8dededff Component for Warsaw upgraded, ver. 2.12.452 2017-01-31 00:44:08 +01:00
Milan Hanajik f318cfe6f0 Network.Camera bug fixes, Operations.ReturnGivenEventOp added, usefull for debuging, ver.2.12.451 2017-01-27 16:37:09 +01:00
Milan Hanajik 3f311d8603 Camera ROI modified for the use of 'periods', ver. 2.12.450 2017-01-27 14:34:17 +01:00
Milan Hanajik 3b13756db9 Measured data extracted from Telnet data, ver.2.12.449 2017-01-27 12:47:32 +01:00
Milan Hanajik 20b3840445 Komponent pre Berlin upgraded. 2017-01-27 09:57:54 +01:00
Milan Hanajik 2a4d95bd7b MersurementOp presunuta do Camera komponentu. 2017-01-27 09:56:58 +01:00
Milan Hanajik e8966f6705 Camera : Logging of incoming measurement datagrams, ver. 2.12.448 2017-01-26 16:18:09 +01:00
Milan Hanajik a20edf7890 Processing 'measurement' datagrams implemented. 2017-01-26 15:45:42 +01:00
Milan Hanajik f1d73421c8 Changes to make it possible to test with dummy components. 2017-01-25 17:59:26 +01:00
Milan Hanajik 97611369c4 Dummy.RegulValve and Dummy.FlowMeter components added. 2017-01-25 17:29:12 +01:00
Milan Hanajik 5ca265fef7 Berlin component upgraded 2017-01-25 17:29:11 +01:00
Milan Hanajik 38c199f6f9 Interfaces between Camera and Roi and sequences finalized, TODO: network communication, ver. 2.12.446
Sequences more robust for debugging, T and Pr-meters checked for null
2017-01-25 17:28:57 +01:00
Milan Hanajik 02ce6bf7c0 Russian resources added, ver. 2.12.443 2017-01-24 16:14:12 +01:00
Milan Hanajik fc3cef37d2 Bug fix : Berlin global defines 2017-01-24 15:47:38 +01:00
Milan Hanajik d9021ea140 Component version logged. 2017-01-24 15:19:11 +01:00
Milan Hanajik ebf03af9c1 Global defines clean-up 2017-01-24 15:06:45 +01:00
Milan Hanajik 044e53f2b2 Changes under construction : ROI registration to Cameras, ver. 2.12.441 2017-01-24 12:34:52 +01:00
Milan Hanajik 01ebd94073 Import of temperature coefficients fixed, ver. 2.12.440 2017-01-23 16:15:18 +01:00
Milan Hanajik e9c7430a48 BenchId conversion for WR9...WR16 in Results.Utils. 2017-01-23 15:38:15 +01:00
Milan Hanajik 2150ced11f Propagation of ROI parameters between ROI-s and Cameras implemented, ver. 2.12.438 2017-01-22 20:40:12 +01:00
Milan Hanajik ada96d3d83 Camera.CLP1611 and Camera.Roi : UseTestImages and TestImagesCount parameters added. 2017-01-22 19:38:16 +01:00
Milan Hanajik 5b4a797719 Bug fix in DeviceTest. 2017-01-22 19:37:02 +01:00
Milan Hanajik 18cf0b5de3 ROI help text modified/corrected. 2017-01-18 16:59:17 +01:00
Milan Hanajik cf876aabd2 Changes done in Munich : Roi CfgChangeHandler, new component, new Headpic, etc. 2017-01-17 16:49:47 +01:00
Milan Hanajik 2ced1417ed Hot bug fixes, ver. 2.12.436 2017-01-16 21:42:59 +01:00
Milan Hanajik 6d45b2c878 RoiDetectionSeq modified, ready to be tested. 2017-01-16 15:51:34 +01:00
Milan Hanajik f5d1014b89 MeasurementOp moved to camera 2017-01-16 14:21:18 +01:00
Milan Hanajik 13d00ee18e Telnet terminal window closing issue fixed, ver.2.12.435 2017-01-16 13:49:30 +01:00
Milan Hanajik c73cf7002f Camera.Roi.MeasurementOp added, UDP listener added, PulsesPerLtr (and ProcedureParams) added, etc. 2017-01-16 13:49:29 +01:00
Milan Hanajik 739759ddc3 Component/Device name displayed in case of an exception during components loading or devices initialization. 2017-01-16 13:49:28 +01:00
Milan Hanajik e34fc6a1f2 Cleanup : IdcCamera and RoI archaic code removed. 2017-01-14 21:09:57 +01:00
Milan Hanajik 6e9bfb61cc DeviceTest extended to 4 components (= parent + 3 components) 2017-01-14 21:09:56 +01:00
Milan Hanajik 5634931cc2 PreviousRoi parameter added to RoiCfg, masks prepared at the very last moment in RoiDetectionOp, Event.RoiDetectionPreviousFailed added. 2017-01-14 21:08:42 +01:00
Milan Hanajik a7c8b90e9f RoI --> Roi 2017-01-14 14:23:32 +01:00
Milan Hanajik 8e058cebbb RoI detection fixed : parses the command line response, returns Event.RoiDetectionPassed or Event.RoiDetectionFailed. 2017-01-13 19:12:28 +01:00
Milan Hanajik 08acc5778a RoI : RoiDetectionOp in progress 2017-01-13 18:36:12 +01:00
Milan Hanajik 2199679d28 DeviceTest extended to 3 components. 2017-01-13 18:35:08 +01:00
Milan Hanajik e730ee1541 Camera.HRLiveStreamOp operation added, RoiDetectionOp moved to RoI component, etc. 2017-01-13 15:27:17 +01:00
Milan Hanajik 7c1d0be9c9 Language resources exported 2017-01-11 12:45:38 +01:00
Milan Hanajik 5ba9352576 pw, ver. 2.12.434 2017-01-11 12:44:57 +01:00
Milan Hanajik 21ee6b7a65 Stop devices that were already started in case of an exception when starting devices --> avoid problems when closing the program. 2017-01-06 13:58:32 +01:00
Milan Hanajik dd85f03328 RoiDetectionOp added, etc. 2017-01-06 00:49:38 +01:00
Milan Hanajik 254afc3978 Network.Adapter, Network.Camera.CLP1611, Network.Camera.RoI Network.Tftp and Network.Telnet components added. Camera detection and live strean work OK. 2017-01-05 19:59:26 +01:00
Milan Hanajik ad51719d92 DeviceTest : logging added, bug fix in saving settings 2017-01-05 19:58:30 +01:00
Milan Hanajik e43e0a6850 Minor fixes, ver. 2.12.433 2016-12-29 12:29:37 +01:00
Milan Hanajik 535af59860 Number of 'Empty tank' buttons in BenchControlPanel 2 or 3 (automatically switched), ver. 2.12.432 2016-12-22 15:38:56 +01:00
Milan Hanajik 3f08036139 ver. 2.12.431 2016-12-22 12:02:11 +01:00
Milan Hanajik 7f31a84000 iPerlST (Special) : idBenutzer = 6 always when writing into Oracle DB, ver. 2.12.430 2016-12-22 08:24:31 +01:00
Milan Hanajik c672a49146 Genesis (UInt128) bug fix, ver. 2.12.429 2016-12-21 17:51:27 +01:00
Milan Hanajik e84f87fcda Bug fix in TBF.Forms.DatabaseSettingsDlg 2016-12-21 15:19:00 +01:00
Milan Hanajik 070f435a23 Login method selection is saved in local settings. 2016-12-21 14:54:38 +01:00
Milan Hanajik 2fcdfabd3c System login : Changes allowing usage of (1) short name, (2) full name, (3) user number. 2016-12-21 14:23:39 +01:00
Milan Hanajik 12053b4531 Login dialogs moved to TBF.Forms namesspace. 2016-12-21 08:06:42 +01:00
Milan Hanajik 1a0b2ee975 Generic bug fix : Procedure crashes when there is no test at all. 2016-12-21 07:56:37 +01:00
Milan Hanajik 13b80de703 Config.IUser interface added, etc. 2016-12-21 07:56:26 +01:00
Milan Hanajik 9bd409e672 Config.Entities.User.CurrentUser --> Config.Data.CurrentUser
Config.Entities.User.LastAuthorization --> Config.Data.lastAuthorization
2016-12-20 14:22:56 +01:00
Milan Hanajik 435e47707d ver. 2.12.426 2016-12-20 13:16:58 +01:00
Milan Hanajik 4da0717729 (1) Transition sequences can be debugged using NEXT, (2) Route using Uint128 fixed. 2016-12-20 13:13:17 +01:00
Milan Hanajik 98fe6223b4 One more change related to Users DB. 2016-12-20 10:16:08 +01:00
Milan Hanajik b4e84c36b8 Users DB added into DatabaseSettings and the related form. 2016-12-19 14:39:28 +01:00
Milan Hanajik bf92f677fe Separate Users DB added. 2016-12-19 13:58:57 +01:00
Milan Hanajik 62f26719ba iPerl bug fixes. 2016-12-19 13:52:00 +01:00
Milan Hanajik beff091699 Databases : Minor improvements, ver. 2.12.424 2016-12-19 13:01:25 +01:00
Milan Hanajik 72debd397f ver. 2.12.423 2016-12-19 10:59:48 +01:00
Milan Hanajik 89901c75f7 Revert "Elde.FlowMeterTwins bug-fix in calculation of ref. pulses and flow."
This reverts commit be52e2df96.
2016-12-16 13:07:54 +01:00
Milan Hanajik 8a73968f41 SLM-END : Component upgraded, ver. 2.12.421 2016-12-16 13:04:19 +01:00
Milan Hanajik eb2c3d00ce Berlin component added, defines for Berlin added, ver. 2.12.420 2016-12-14 11:09:23 +01:00
Milan Hanajik dd62310e59 ulong --> UInt128 in all 'route' related variables, ver. 2.12.419 2016-12-12 17:39:12 +01:00
Milan Hanajik a782d3960a .gitignore and clean.bat updated after Dirichlet.Numerics addition. 2016-12-12 16:43:05 +01:00
Milan Hanajik d5f91e9bab 'Route' type changes from uint to Dirichlet.Numerics.UInt128 2016-12-12 16:43:05 +01:00
Milan Hanajik be52e2df96 Elde.FlowMeterTwins bug-fix in calculation of ref. pulses and flow. 2016-12-12 16:43:04 +01:00
Milan Hanajik 72418d802c UInt128 type added - Dirichlet.Numerics project/namespace 2016-12-12 16:42:55 +01:00
Milan Hanajik 534361b540 Puchong-PT200 component updated (dated 07.11.2016) 2016-12-12 12:09:03 +01:00
Milan Hanajik 77782a8729 sensus a xylem brand logo in AboutDlg, ver. 2.12.417 2016-12-12 10:29:02 +01:00
Milan Hanajik 7dc42fb900 EnduranceDataLogging - initial version, ver. 2.12.416 2016-12-12 00:01:25 +01:00
Milan Hanajik da4b5a50a7 Import of temperature coefficients, ver. 2.12.415 2016-12-10 17:33:14 +01:00
Milan Hanajik c8c411aebc TestMethods.OuterLoop.Start/End UI changes, ver. 2.12.414 2016-12-10 16:27:51 +01:00
Milan Hanajik 8b4890560e Warsaw-END component updated, FW upgrade is required !!!, ver. 2.12.413 2016-12-10 15:12:47 +01:00
Milan Hanajik 216e08d57c Execute(...) arguments changed everywhere, repetitionNr usage depends on outerLoopMode, outerLoopCounter, ver. 2.12.412 2016-12-10 13:03:35 +01:00
Milan Hanajik f9888a2108 TestMethods.OuterLoop.Start and TestMethods.OuterLoop.End added. 2016-12-10 12:13:45 +01:00
Milan Hanajik f3b178473c Outer loop logic added, TODO: (1) Begin-block and End-block test methods, (2) support in test method sequences 2016-12-10 11:33:31 +01:00
Milan Hanajik 20c7b07cb9 Endurance : Switching test : Progress bar update and statistics added. 2016-12-10 11:33:30 +01:00
Milan Hanajik 5e4da449ad Endurance TestParams disabled. 2016-12-10 11:33:30 +01:00
Milan Hanajik c8d0c647b7 Endurance : uint[3] cBrd.WMeterCont added, ver. 2.12.411 2016-12-10 11:33:18 +01:00
Milan Hanajik e1eedb039c Warsaw-END, SLM-END : Number of water meters changed to 10, ver. 2.12.410 2016-12-09 19:44:20 +01:00
Milan Hanajik c30043d4fc Warsaw-END, Endurance : Component updated, CycleStepsCtrl UI fixed, ver. 2.12.408 2016-12-09 18:06:14 +01:00
Milan Hanajik 58a3340f53 Endurance : cBrd.CyclePar usage change, ver. 2.12.407 2016-12-09 16:37:25 +01:00
Milan Hanajik 1143fa79ae Dummy.Diverter component added 2016-12-09 12:20:35 +01:00
Milan Hanajik 56217a68ce Dummy.Valve component added 2016-12-09 12:20:23 +01:00
Milan Hanajik 6df36659ab Dummy.Balance component added 2016-12-09 12:13:59 +01:00
Milan Hanajik 6f599d55c5 Endurance : Bux fixes 2016-12-09 10:57:27 +01:00
Milan Hanajik b91888213b ExecuteCommandOp added (Endurance). 2016-12-08 14:36:51 +01:00
Milan Hanajik 10221d636c Endurance cycle UI: duration in 10ms steps, message disabled, Uint32 used, other minor changes. 2016-12-08 10:58:09 +01:00
Milan Hanajik 5c9adba751 Endurance cycle steps dialog added. 2016-12-07 20:57:32 +01:00
Milan Hanajik d2af4f224e ver. 2.12.404 2016-12-07 15:44:50 +01:00
Milan Hanajik 3a029432f8 Start- and End-volume for the fixed start method can be saved/printed in results. 2016-12-07 15:44:26 +01:00
Milan Hanajik 72a5385c57 TempMeter has 'Default temperature' parameter which specifies a value for simulated mode. 2016-12-05 23:22:33 +01:00
Milan Hanajik 1028866721 Initial version of a component for Genesis (the previous one was the one for Puchong). 2016-12-05 13:27:09 +01:00
Milan Hanajik 9bd37c2980 Components management : fix of UI behavior. 2016-12-05 13:25:24 +01:00
Milan Hanajik 00e0bc5ab7 Warsaw-END : (1) FMFreq[] array size changed to 4, (2) Component upgraded (component 161202-2), ver. 2.12.399 2016-12-02 15:01:44 +01:00
Milan Hanajik e69836b03c TBF : Type-safe structured queries used everywhere, ver. 2.12.397 2016-12-02 12:52:30 +01:00
Milan Hanajik ae8ba80f67 (1) Test wizard includes 'Heat meters' step only when HEAT_METERS_SUPPORT defined, (2) type-safe queries. 2016-12-02 11:04:33 +01:00
Milan Hanajik 1f3a2af043 (1) Component wrapper modified for endurance tests (uint CyclePar[]), (2) Warsaw-END line size. 2016-12-02 09:48:47 +01:00
Milan Hanajik 4917b0c0c4 TestMethods.Endurance test method added. 2016-12-02 09:10:17 +01:00
Milan Hanajik cec1816f82 Components can be deleted, component ItemNr-s are updated before saving to DB, ver. 2.12.396 2016-11-30 14:16:51 +01:00
Milan Hanajik 1bc3137d20 ver. 2.12.395 2016-11-28 14:13:09 +01:00
Milan Hanajik ed416e5237 Cevak : Changes in printing, PrintDocumentCevak.cs in Results.Output.Printers only. 2016-11-28 14:12:56 +01:00
Milan Hanajik 37d61658d4 ResultsBrowser : Print -> Drucken, ver. 2.12.393 2016-11-28 10:13:29 +01:00
Milan Hanajik 9d67343e2e Endurance components updated (SLM, Warsaw) 2016-11-28 09:49:27 +01:00
Milan Hanajik 7477a536da ResultsBrowser : Printing a table with statistics, ver. 2.12.392 2016-11-23 14:07:04 +01:00
Milan Hanajik 59c0f73dd2 ver. 2.12.292 2016-11-21 12:38:36 +01:00
Milan Hanajik 02c7ac37f5 Support for WARSAW_END added (define WARSAW_END; LANG_PL) 2016-11-21 11:17:00 +01:00
Milan Hanajik 5114f5f1eb ResultsBrowser : Printing statistics in progress. 2016-11-21 11:03:44 +01:00
Milan Hanajik 0a1966d7bd ResultsBrowser : (1) More safe StatisticsOptionsDlg, (2) ResultsConfigDlg initializes 'Caption', ver. 2.12.392 2016-11-19 00:41:56 +01:00
Milan Hanajik 9b457299ea (1) German : Mounting : 'S' --> 'STR', (2) bug fix in ResultsBrowser Statistics, ver. 2.12.391 2016-11-18 15:46:50 +01:00
Milan Hanajik 8b8c0c09df ResultsBrowser : Time range display function added, ver.2.12.390 2016-11-18 15:18:21 +01:00
Milan Hanajik eb5f3465c8 ResultsBrowser : Statistics : rows and columns are combinations of two items, ver. 2.12.390 2016-11-18 14:15:54 +01:00
Milan Hanajik 1487e7889b ResultsBrowser : (1) clean-up, (2) bug in statistics fixed, (3) captions used to select statistics, ver. 2.12.389 2016-11-18 11:56:22 +01:00
Milan Hanajik 2c0914baf8 PMaxTest, LeakTest : Minor modifications in pressure adjustment steps. 2016-11-18 11:03:44 +01:00
Milan Hanajik b75a8105de MunichPrintDocument : (1) Water pressure in bar, (2) Aux meter data bug fixed, ver. 2.12.388 2016-11-17 11:12:43 +01:00
Milan Hanajik 0a827e0eb6 German translations, LANG_DE introduced, ver. 2.12.387 2016-11-17 10:24:07 +01:00
Milan Hanajik 98a773700e Bug fix related to PressMtrDelta, ver. 2.12.386 2016-11-17 08:48:52 +01:00
Milan Hanajik 2189c2150e Munich3 entry form (single) with 'Disabled' check boxes, ver. 2.12.385 2016-11-17 06:51:15 +01:00
Milan Hanajik 92f77bf6d6 Some localization to German 2016-11-16 22:13:48 +01:00
Milan Hanajik a5799290c9 ResultsBrowser : Synchronized with branch 2.9, ver. 2.12.384 2016-11-16 15:57:23 +01:00
Milan Hanajik 16d471f12e Munich : Previous results form : 'Show' button localization, etc. 2016-11-16 15:28:02 +01:00
Milan Hanajik ec0eecde50 ver. 2.12.384 2016-11-16 13:21:15 +01:00
Milan Hanajik b649c282e8 iPerlST : Modification in writing calibration factors via RFID. 2016-11-10 14:09:02 +01:00
Milan Hanajik 3e6243a8b7 Puchong component upgraded, component date: 27.07.2016 2016-11-04 14:52:49 +01:00
Milan Hanajik 02b29d9553 LU Logging : KorrFehlerXy parameter correctly written to logs. 2016-11-02 13:46:50 +01:00
Milan Hanajik 04cec33bf6 iPerlCommunication : "Normalize calibration factor" activity added. 2016-11-02 13:34:04 +01:00
Milan Hanajik eee5e5dc8c Bug fixes in DataEntry.HeatMeters12 2016-10-29 20:35:48 +02:00
Milan Hanajik 09166ae73c Bug fix in DataEntry.HeatMeters6 2016-10-29 20:31:08 +02:00
Milan Hanajik 52d0c1907f DataEntry.HeatMeters6 and FixedStartMassCollectionSeq bug fixes, ver. 2.12.380 2016-10-28 18:45:43 +02:00
Milan Hanajik 5620ba61fa SensusOracle.Database : Minor changes in LU logging, Utils.DoubleToStr() modifications. 2016-10-27 14:54:37 +02:00
Milan Hanajik 63b5507f78 iPerlCommunication : 250ms delayafter writes, more logging, Opto-Data indication using pictureBoxes fixed. 2016-10-27 14:30:12 +02:00
Milan Hanajik 1ad8a69717 SLM-END component added, master branch modifications for SLM_END and WARSAW_END, ver. 2.12.378 2016-10-26 19:43:56 +02:00
Milan Hanajik 8be072ca52 ver. 2.11.375 2016-10-24 09:11:19 +02:00
Milan Hanajik cdea0e96b6 Malta WSD25 component upgraded, colors of valves changed. 2016-10-19 11:38:52 +02:00
Milan Hanajik bab677c5c2 PressMtrDelta added to BenchPath, PressDeltaXyz added to TestRslt, test methods modified, ver. 2.12.373 2016-10-18 19:14:01 +02:00
Milan Hanajik d1fb0e0f0a T warm/cold lo/hi renamed to T hi/lo min/max 2016-10-18 17:27:24 +02:00
Milan Hanajik 08d854f6f8 Modbus.PressureMeter.Meret implemented, ver. 2.11.372 2016-10-18 17:27:22 +02:00
Milan Hanajik 93e8328940 IModbus and Modbus modification : Supports receiving telegrams from multiple devices. 2016-10-18 17:27:08 +02:00
Milan Hanajik b608fb77b9 DeviceTest saves settings of both components, it's PERFECT !!! 2016-10-18 17:26:48 +02:00
Milan Hanajik 03c027ab33 LogProcessDataHeatMeters, ver. 2.11.371 2016-10-18 11:49:32 +02:00
Milan Hanajik 14de767c52 Modbus.Common.Modbus.SendMessage(byte deviceAddress, byte function, ...) function added. 2016-10-18 11:31:17 +02:00
Milan Hanajik 9e90d3a93f DeviceTest program functional, runs operation Modbus.PressureMeter.Meret.ReadPressureOp(...) 2016-10-18 11:30:02 +02:00
Milan Hanajik 97fbcbbf58 Malta WSD25 : Bug fix for reference flowmeter with idx = 8 (EtCalib[] array size increased to 9), ver. 2.11.370 2016-10-17 16:06:50 +02:00
Milan Hanajik 1b77c903f7 Component for Malta upgraded, ver. 2.11.369 2016-10-17 08:48:58 +02:00
Milan Hanajik 844a743c6b Device test works OK, initializes and runs 2 devices. 2016-10-16 22:43:55 +02:00
Milan Hanajik d4cbec50ba Reference temperatures (Hi and Lo) added to results. 2016-10-14 16:54:19 +02:00
Milan Hanajik 588d16caf9 ver. 2.11.368 2016-10-14 16:17:56 +02:00
Milan Hanajik fc3512a23a Config.Units and Results.WMeterRsltItemSpec changes under construction 2016-10-14 16:07:45 +02:00
Milan Hanajik f8f08fb8ce DeviceTest changes under construction. 2016-10-14 16:07:34 +02:00
Milan Hanajik 790364832d Transition sequences can be renamed and deleted. 2016-10-13 18:06:13 +02:00
Milan Hanajik 0fb3a74879 Feeding regulation valves functionality implemented, ver. 2.11.367 2016-10-13 16:08:29 +02:00
Milan Hanajik 45e0f50562 Elde.RegulValve supports 'ReTryCommands' parameter (default = false), ver. 2.11.365 2016-10-13 16:08:15 +02:00
Milan Hanajik caf43fedb3 IRegulValve change, regulation valves support Category, Category saved in settings, used in Feeding Paths UI, not used in tests yet, ver. 2.11.364 2016-10-12 15:47:45 +02:00
Milan Hanajik 1388f459fe Malta WSD25 : Component upgraded, ver. 2.10.363 2016-10-12 09:55:44 +02:00
Milan Hanajik dddfc4bed5 Bug-fixes in FlyingStart and FlyingStartMassCollection heat meters, T ref warm and T ref cold statistics, ver. 2.10.362 2016-10-12 01:23:38 +02:00
Milan Hanajik 2057cc6b73 Malta WSD25 component upgraded, MERET addresses array size changed to 12, ver. 2.10.361 2016-10-11 17:01:33 +02:00
Milan Hanajik 4e29e88b02 DeviceTest project added. 2016-10-11 16:57:53 +02:00
Milan Hanajik aff7961a4e Users 2016-10-11 16:18:11 +02:00
Milan Hanajik 76dbf4e216 Length of array for MERET addresses is 11. 2016-10-11 15:24:18 +02:00
Milan Hanajik 1fc129117f Output.FileWriters.Basic.HeatMeters 2016-10-11 14:55:16 +02:00
Milan Hanajik f866f5fb2c Output.FileWriters.Enhanced.HeatMeters 2016-10-11 14:27:28 +02:00
Milan Hanajik 38d6016aec DataEntry.HeatMeters6 component added. 2016-10-11 13:05:40 +02:00
Milan Hanajik b3a2c3a0fc FlyingStart, FlyingStartMassCollection and CombinedWithDetection methods support Simulation mode, ver. 2.10.360 2016-10-11 12:53:17 +02:00
Milan Hanajik c84fd8089a FlyingStart and FlyingStartMassCollection methods: 'Begin cycle' dialog closed before 'Heat meters prompt message' is displayed. 2016-10-11 09:10:33 +02:00
Milan Hanajik 2e4c59d3b5 Keithley Multimeter supports simulation mode. 2016-10-11 09:09:04 +02:00
Milan Hanajik 5f21b5ab26 ErrorLimitHi, ErrorLimitLo, EvaluateVolume test parameters added to all heat meters methods. 2016-10-10 14:35:59 +02:00
Milan Hanajik f8331c1c1c Heat meters : Prompt message does not stop the sequence, disappears when conditions met, ver. 2.10.359 2016-10-10 14:23:20 +02:00
Milan Hanajik 3c15dbab9e Bug fixes in heat meter testing using pulses, Flying start and Flying start mass collection methods, ver. 2.10.358 2016-10-10 11:35:45 +02:00
Milan Hanajik d5eb20854f Displaying heat meter test results on screen fixed, ver. 2.10.357 2016-10-07 18:19:17 +02:00
Milan Hanajik 438028506e Flows are internally stored and processed in double variables (except of Qfrom, Qto, flowmeter nominal flow) 2016-10-07 16:22:36 +02:00
Milan Hanajik 010afcd1e4 Temperatures are internally stored and processed in double variables (except of ambient temp.). 2016-10-07 15:41:27 +02:00
Milan Hanajik 7df9333fba Statistics return doubles instead of float, casting is done just when writing to entities. 2016-10-07 14:46:14 +02:00
Milan Hanajik 4160420844 Masses are stored in double variables everywhere. 2016-10-07 14:06:54 +02:00
Milan Hanajik 9f2e8407a0 Modbus.PressureMeter.Meter component added, ver. 2.10.357 2016-10-07 11:59:13 +02:00
Milan Hanajik 45c64ae44b Modbus does not use an extra worker thread. 2016-10-07 11:55:44 +02:00
Milan Hanajik e8748bab70 (1) QuidoRS dead code clean-up, (2) Elde.PressureMeter units conversion clean-up. 2016-10-07 11:55:03 +02:00
Milan Hanajik c30f905893 SLM50 : Bugfix in energy calculation in FlyingStart and FlyingStartMassCollection methods, ver. 2.10.356 2016-10-07 10:09:38 +02:00
Milan Hanajik 8932c232e2 Malta : Another minor change, ver. 2.10.355 2016-10-06 14:26:08 +02:00
Milan Hanajik 295e96098c Malta : Minor changes, extended range of Id-s for flow meters and pressure meters, ver.2.10.354 2016-10-06 14:02:16 +02:00
Milan Hanajik dff3a1aff7 Changes in 'master' for Malta-WSD25, ver. 2.10.353 2016-10-06 11:54:38 +02:00
Milan Hanajik c497c02ef9 Heat meters support for measurement with pulses, change in ResultsDB.MeterTestRslt, ver. 2.10.352 2016-10-06 10:11:13 +02:00
Milan Hanajik f51360c23d Upgraded to NHibernate 4.0.4, IesiCollections 4.0.0, FluentNHibernate 2.0.3, MySQL.Data, all are using.Net 4.0 now, ver. 2.10.351 2016-10-05 11:23:06 +02:00
Milan Hanajik 2286877fad Test method names cleaned up. 2016-09-26 11:08:16 +02:00
Milan Hanajik a1810baffa ver. 2.10.350 2016-09-23 15:51:12 +02:00
Milan Hanajik 6bb45ccc25 Support for GENESIS added, ver. 2.10.349 2016-09-22 08:50:22 +02:00
Milan Hanajik 5f7c0c82e7 Bug fix: summaryResults, allResults: ambient pressure in mbar, water pressure in kPa. 2016-09-14 13:05:26 +02:00
Milan Hanajik 1d964e5fcc Czech resources added to ResultsBrowser. 2016-09-08 08:33:44 +02:00
Milan Hanajik 85ca2420bd Bugs in printers caused by a change of ambient pressure representation fixed. 2016-09-07 18:29:25 +02:00
Milan Hanajik c835fe5551 Keithley.TempMeter resistance 0 < R < 2000 Ohm 2016-08-26 11:36:42 +02:00
Milan Hanajik 9563dbdb6f Using ITS-27 coefficients possible as well. 2016-08-25 17:36:27 +02:00
Milan Hanajik 3666752414 Some Keithley.TempMeter parameters (ITS-90, certificate) are accessible through Bench -> Metrology dialog. 2016-08-25 15:54:21 +02:00
Milan Hanajik c842c50361 Heat meters evaluation added to FlyingStartMassCollectionSeq and FlyingStartSeq, ver. 2.10.345 2016-08-24 18:30:00 +02:00
Milan Hanajik 49c6ebf9c7 FileWriter or Printer crash handled, different writers/printers do not interfere with each other and results are always saved to DB. 2016-08-24 15:46:43 +02:00
Milan Hanajik 5824564e25 TestBenchSim modification. 2016-08-24 15:46:41 +02:00
Milan Hanajik e484697f60 Heat meters reference temperature measurement during Data entry form before the test starts. 2016-08-24 15:46:39 +02:00
Milan Hanajik 9d53d7aaa8 Bug fix in Keitheley.TempMeter TempMeterCfgCtrl, minor change in Keithley.Multimeter_2010_RS232. 2016-08-24 15:46:37 +02:00
Milan Hanajik 1feb3215e5 Keithley.TempMeter uses ITS90 forms for Platinum resistance thermometer, ver. 2.10.344 2016-08-24 10:49:52 +02:00
Milan Hanajik 581819de9f DataEntry.HeatMeters12 checks the entered data using 2x error limits. 2016-08-24 10:49:50 +02:00
Milan Hanajik 8cc0f3ceb4 Bug fix : STOP button not functional when emptying the tank, checking the weight. 2016-08-24 10:49:49 +02:00
Milan Hanajik 456687478d Parse .. Double functions added to Utils. 2016-08-24 10:49:47 +02:00
Milan Hanajik 618f0b1bca Modification of sequences to use ProcessData.TempRefWarm(Cold)1(2) and ReadTempOp operations, ver. 2.10.343 2016-08-23 15:21:33 +02:00
Milan Hanajik 700b9b3122 Keithley modifications. 2016-08-23 15:21:17 +02:00
Milan Hanajik fc0bdda553 DataEntry.HeatMeters12 keeps the 'Units' selection while the software is running, restores default on start-up, ver. 2.01.342 2016-08-22 16:14:40 +02:00
Milan Hanajik 1dbe9890f3 Units of energy MJ and MWh added. 2016-08-22 16:01:34 +02:00
Milan Hanajik 0f7790e538 Prompt message box at the beginning of each heat meters test. 2016-08-22 16:00:48 +02:00
Milan Hanajik 9c0430a0d8 Adjustment component class name changed to TestMethods.Adjustment.Single 2016-08-22 15:59:37 +02:00
Milan Hanajik df7631eb3a Units of energy can be selected in DataEntry.HeatMeters12.TestStartEndForm. 2016-08-22 13:55:28 +02:00
Milan Hanajik 4ce613a82d Bug fix: Settings of Output.FileWriters.Enhanced after upgrade wizard. 2016-08-22 10:55:48 +02:00
Milan Hanajik d8bb450a2e VolumeForEnergy calculated in [l], ver. 2.10.341 2016-08-22 09:58:27 +02:00
Milan Hanajik 774d47a86f More changes and fixes for heat measurement. 2016-08-21 22:07:20 +02:00
Milan Hanajik e3318179c1 More changes for heat meters testing, DataEntry form completed. 2016-08-19 17:19:09 +02:00
Milan Hanajik 74738ff78c Heat meters results items. 2016-08-19 15:48:54 +02:00
Milan Hanajik 53ead401d0 FixedStartMassCollection : Changes for heat metetrs 2016-08-19 15:37:16 +02:00
Milan Hanajik 0426d2510a Energy and RefEnergy added to ResultsDB, First/Last/Min/Max of all three ambient values added to TestRslt, ver. 2.10.340 2016-08-19 15:37:00 +02:00
Milan Hanajik ef5bbe737c Sequences.FloatStatistics -> Sequences.Statistics: use double internally, provide double Sum property. 2016-08-19 14:33:32 +02:00
Milan Hanajik 50194001d9 There is only one ListViewEx in Results.Forms now. 2016-08-19 11:50:19 +02:00
Milan Hanajik f696d20060 It is possible to run the 2nd instance of TBF program in off-line mode, ver. 2.9.339 2016-08-19 10:16:47 +02:00
Milan Hanajik 83ddb7c8bf Waiting loop for temperature stability check in heat meters tests. 2016-08-17 18:11:34 +02:00
Milan Hanajik 7d8c23d014 DataEntry.HeatMeters12 data entry form component added. 2016-08-17 18:10:48 +02:00
Milan Hanajik 011219d491 Heat meters test parameters updated. 2016-08-17 16:32:07 +02:00
Milan Hanajik d4b20876b2 All FixedStart, FlyingStart and FlyingStartMassCollection methods reorganised, common sequences used, ver. 2.9.337 2016-08-17 15:38:09 +02:00
Milan Hanajik 785aae3b73 HeatMetersPath modifications, DB change. 2016-08-17 10:32:03 +02:00
Milan Hanajik 91cb245f84 ResultsBrowser : ../Cfg directory used for configuration instead of AppData/Local/..., ver. 2.9.336 2016-08-17 09:44:50 +02:00
Milan Hanajik 0859dd28d5 PMAxTest, LeakTest, pressure in bar internally, ver. 2.9.335 2016-08-16 08:32:55 +02:00
Milan Hanajik df91e435bb Upgrade for internal pressure interpretation change, ver. 2.9.334 2016-08-15 17:31:37 +02:00
Milan Hanajik 15f96e86ac iPerlST : Workaround for Q3 with multiple parts, ver. 2.9.333 2016-08-15 13:44:18 +02:00
Milan Hanajik a49912bdb1 Mouse right-click handler for ListViewEx implemented, copying the content to all cells below implemented in Paths, Transitions, Metrology corrections, process and test parameters. 2016-08-15 13:35:00 +02:00
Milan Hanajik f7a7987831 Configs.NameOnly.TestMethodCfg[Ctrl] introduced and reused by Adjustment, FixedStartAdvanced, ...
... FixedStartCombinedMeters, FixedStartMassCollection, FlyingStart, FlyingStartMassCollection, ReferenceFlowMeterCalibration.
2016-08-15 10:14:14 +02:00
Milan Hanajik 8dae45e10e IComponentCfg and IComponentFactory interfaces and all derived classes modified. 2016-08-05 14:32:36 +02:00
Milan Hanajik 4d616939ad TestWizard.HeatMetersSelection added. 2016-08-04 16:47:21 +02:00
Milan Hanajik e5ad1ac93b HeatMeters test method, ver.2.9.333 2016-08-04 15:46:17 +02:00
Milan Hanajik faffa8a270 Heat meters path modified, ver. 2.9.332 2016-08-04 14:01:54 +02:00
Milan Hanajik 4a2342c015 ver. 2.9.331 2016-08-03 10:31:31 +02:00
Milan Hanajik 283a9ebaa1 Upgrade menu item and UpgradeSelectionDlg added. 2016-08-03 09:59:55 +02:00
Milan Hanajik a07aa13358 Oracle DB change : VT_PRUEFDURCHFLUSS_PD, ver. 2.9.330 2016-08-02 23:08:16 +02:00
Milan Hanajik b3ceb6f300 Style change 2016-08-02 23:06:53 +02:00
Milan Hanajik 111e3d8647 Minimum and maximum (reference) flow during a test calculated and saved to Results.Entities.TestRslt. 2016-08-02 14:48:18 +02:00
Milan Hanajik 606c74f3dc All pressures are stored in bar instead of mbar. Units are not localized, (concatenated in localized texts). 2016-08-02 14:46:30 +02:00
Milan Hanajik c88ac1fcab Pressure up and Pressure down stored in mbar, not in kPa. Display in process data screens fixed. 2016-08-02 10:47:51 +02:00
Milan Hanajik b9ea2087de 'open' valves in paths and sequences are displayed with 'LightGray' background for easy reading, ver. 2.9.330 2016-08-01 17:41:43 +02:00
Milan Hanajik dcadd29791 Label printer modification for Israel PT200. 2016-08-01 15:41:46 +02:00
Milan Hanajik 69f7e62e4e Generic results items improvement: enum values used to create result items to guarantee uniqueness. 2016-08-01 15:41:07 +02:00
Milan Hanajik 63abe74aed Upgrade wizard for Output.FileWriters.Enhanced components. Test items from local settings are used. 2016-08-01 13:46:21 +02:00
Milan Hanajik 68c6111377 Larger component configuration controls and ComponentParametersDlg, ver. 2.9.329 2016-08-01 11:22:59 +02:00
Milan Hanajik 32a8b95c32 Multiple running instances of TBF program tested. 2016-07-19 10:13:57 +02:00
Milan Hanajik 687bc3ed0c New user has number 6 for IPERLST as well as for IPERLST_SPECIAL. 2016-07-12 22:42:29 +02:00
Milan Hanajik c71626adaf SLM-50 component updated. 2016-07-11 19:28:22 +02:00
Milan Hanajik c0c46a1181 ver. 2.9.328 2016-07-11 13:10:25 +02:00
Milan Hanajik f0bd10bb12 ver. 2.9.327 2016-07-11 12:57:36 +02:00
Milan Hanajik 92787ccd4f 'Break' in BenchControlPanel is visible by default (invisible in German). 2016-07-11 12:55:04 +02:00
Milan Hanajik 4794e73994 Qfrom, Qto removed from MetersPath, ver. 2.9.326 2016-07-11 10:20:50 +02:00
Milan Hanajik fd69bc6376 Heat coefficient for water implemented in Formulas class, ver. 2.9.323 2016-07-08 16:10:04 +02:00
Milan Hanajik d8e8156cc9 Heat meter sensors UI bug fix. 2016-07-08 09:29:20 +02:00
Milan Hanajik fa2896d755 Enthalpy calculation (1st ver.), heat meters path modifications (incl. UI) 2016-07-07 16:02:57 +02:00
Milan Hanajik a7571a6bb7 All temperature meters implement ReadTemp() function. 2016-07-07 11:08:01 +02:00
Milan Hanajik 19dc994616 Heat meters path checked when a test with heat meters is started. 2016-07-07 09:52:54 +02:00
Milan Hanajik a1a0e319ce iPerlSpecial component 2016-07-06 16:01:31 +02:00
Milan Hanajik 0ac1fe2b4e HeatMetersPath, UI, etc., HEAT_METERS_SUPPORT symbol introduced
ProcedureDlg modifications: (1) localization by TBF.Resources.Strings, (2) Heat meters support
FlyingStartMassCollection and CombinedMeters methods with similar sequences
2016-07-06 15:59:28 +02:00
Milan Hanajik 7cbbb2270b Heat meters, ver. 2.9.322 2016-07-01 09:44:03 +02:00
Milan Hanajik ac1bdbe476 Bug fix: Updating water meter results in case of a test with parts, copes also with single meters/multiple lines. 2016-06-30 14:03:51 +02:00
Milan Hanajik 799fda63e9 Bug fix : Updating water meters results in case of test with 'parts'. 2016-06-30 12:55:35 +02:00
Milan Hanajik 9d56836c80 Procedure number displayed in ProceduresDlg (the list of procedures).
Deleting a procedure modified, confirmed by a question, change applied to the DB immediately,
Localization to DE, CS, ...  pressure test and leak test, etc.
2016-06-28 15:09:32 +02:00
Milan Hanajik 91dff782a3 Puchong PT200: NOK --> NG in all protocols, ver. 2.8.315 2016-06-27 16:47:23 +02:00
Milan Hanajik 8a3a0ca6ef (1) iPerlCommunicationForm displays green/red rectangle as opto-data indication, (2) ProcedureDlg displays date and time of changes, ver. 2.8.314 2016-06-27 15:45:35 +02:00
Milan Hanajik d393a519f3 statusP displayed in the status bar. 2016-06-27 13:31:21 +02:00
Milan Hanajik 4dcd018642 Keithley.RS232 and Keithley.TempMeter components added, ver. 2.8.313 2016-06-23 18:07:53 +02:00
Milan Hanajik accd439be8 ver. 2.8.312 2016-06-23 15:19:11 +02:00
Milan Hanajik 799c7b6fdb DataEntry.Standard12.CycleBeginningForm shows WM result only at the end, not at the beginning, ver.2.8.311 2016-06-23 13:01:47 +02:00
Milan Hanajik 550be3f8a3 Zmeny do mastera pre SLM-50 2016-06-23 09:47:02 +02:00
Milan Hanajik 264e5d9cd0 Displaying previous results: Window size saved and restored correctly, ver. 2.8.310 2016-06-22 16:35:38 +02:00
Milan Hanajik 448dbcdf2f Max 8 characters for an iPerl purchase order, ver.2.8.309 2016-06-22 12:29:30 +02:00
Milan Hanajik 284673c200 DataEntry.Standard12 changes - Sensus extensions, ver.2.7.308 2016-06-20 15:31:22 +02:00
Milan Hanajik 887fde3620 Auto S/N button added to DataEntry.Standard12.CycleBeginningForm. 2016-06-20 11:30:40 +02:00
Milan Hanajik b909c82b28 DataEntry.Standard12 modified, Results.Entities modified (WaterMeter.ResultCode, Batch.Remark), DB changed, ver.2.8.308 2016-06-20 09:58:26 +02:00
Milan Hanajik 0c3ed1e1bf TBF.BenchControl.DataEntry.Standard12 extensions - start of changes 2016-06-17 13:37:42 +02:00
Milan Hanajik 4b8f9e031e (1) ResultConfigDlg does not close on Enter, (2) wider 'purchase order' field in PreviousresultsCtrl, ver.2.7.307 2016-06-16 17:28:31 +02:00
Milan Hanajik 1337fff2dc Fixed: (1) STOP button does not function in FlyingStart and FlyingStartMassCollection methods, (2) Results.Entities.WaterMeterData.Equals(.) 2016-06-15 17:04:25 +02:00
Milan Hanajik e6d38040e0 Previous results display after changing the window size uses a timer, ver.2.7.306 2016-06-13 11:08:32 +02:00
Milan Hanajik cbf6b286db ResultsScreen restored t ooriginal state without BatchResultsCtrl use. 2016-06-10 18:23:22 +02:00
Milan Hanajik 6fe2e01026 Pop-up dialog with previous results tested - fixed - is OK. 2016-06-10 18:21:06 +02:00
Milan Hanajik 147fb6fb30 Possibility to display previous results ('Show' button), ver.2.7.305 2016-06-10 16:30:29 +02:00
Milan Hanajik d439d94645 DataEntry.StandardXX : EnterSerialNrsAtTheEnd and SensusExtensions supported in all StandardXX, ver.2.7.303 2016-06-10 13:03:00 +02:00
Milan Hanajik 2c0e8c90ed TBF Refactoring: DataEntry.Standard --> DataEntry.Standard6 2016-06-10 12:08:08 +02:00
Milan Hanajik 08945212c7 iPerlST : OracleDB : WM flow bug fix. 2016-06-06 16:01:31 +02:00
Milan Hanajik 8a91d60c46 ResultsBrowser: Results displayed in the window can be configured, items and column widths are saved together with filters., ver.2.7.303 2016-06-06 15:33:22 +02:00
Milan Hanajik 5e78d54cea enum Publish descriptions in three languages, ver.2.7.303 2016-06-06 11:23:07 +02:00
Milan Hanajik 175d5b8d7f ResultBrowser: Result items in statistics localized (! units), ver.2.7.302 2016-06-05 21:11:36 +02:00
Milan Hanajik e5e6083c49 DE fixed, ver.2.7.301 2016-06-03 15:33:51 +02:00
Milan Hanajik 0a44598fb7 ResultBrowser: ListView behavior fixed, ver.2.7.300 2016-06-03 15:20:03 +02:00
Milan Hanajik acd614a20d Munich: Unused buttons are hidden 2016-06-03 14:35:47 +02:00
Milan Hanajik b36a965678 German language (Publish, Evaluate, Always, Never, OnScreen, Internal), ver.2.7.301 2016-06-03 14:30:44 +02:00
Milan Hanajik 59fc7e30d8 ResultsBrowser: Statistics implemented (NOK yet), user options saved in LocalSettings. 2016-06-03 14:03:12 +02:00
Milan Hanajik 52f600cb94 ResultsBrowser: Protocol and Qn filter added. 2016-06-03 10:34:41 +02:00
Milan Hanajik 0bcfb489af ResultsBrowser: MunichPrinter, Resources, Language, etc. 2016-06-03 10:06:13 +02:00
Milan Hanajik 18234bb713 ResultsBrowser: Query implemented. 2016-06-03 00:19:23 +02:00
Milan Hanajik ebffe9b1cb ResultsBrowser: Serialization works fine. 2016-06-02 23:10:13 +02:00
Milan Hanajik b0137f9384 Munich: resources, SatusP and Route in MainWnd, cleanup, etc., ver.2.7.300 2016-06-02 15:17:43 +02:00
Milan Hanajik 8bb227393e Fixes in resources. 2016-06-02 13:42:56 +02:00
Milan Hanajik cd671f9e77 Munich: Possibility to print the protocol again, ver.2.7.299 2016-06-02 12:56:18 +02:00
Milan Hanajik f65fefe1ff Dr ob., Dr un. --> Dr ein, Dr aus 2016-06-02 11:32:30 +02:00
Milan Hanajik cfcce08047 Munich: AsYesNoForm wider to accomodate German text, ver.2.7.298 2016-06-02 10:10:25 +02:00
Milan Hanajik aa6c12e388 ResultsBrowser: ResultsBrowserWnd and Filters folder/controls added. 2016-06-02 10:04:22 +02:00
Milan Hanajik b34b031fcf Bug fix: SetFlowOp for coaxial regulation valve. 2016-05-31 11:32:02 +02:00
Milan Hanajik 19dff40664 Logging change 2016-05-31 11:07:11 +02:00
Milan Hanajik 2935bc2c77 Many localisation improvements, ver.2.7.297 2016-05-29 23:17:48 +02:00
Milan Hanajik 1a4d20b6e2 Localization of Results.ItemSpec (+German). 2016-05-28 13:40:27 +02:00
Milan Hanajik 5c93b55f58 iPerlSpecial: Changes done on the system while testing Output.FileWriters.Enhanced protocol, ver.2.7.296 2016-05-26 17:14:55 +02:00
Milan Hanajik 6e418b1fc4 Output.FileWrites.Enhanced uses a list of commonItems, etc. (localization). 2016-05-26 14:02:12 +02:00
Milan Hanajik f81dcc1d82 ResultsConfigDlg moved to Results assembly. 2016-05-26 10:38:43 +02:00
Milan Hanajik 63de7b9aa8 Fixes for iPerls after modifications done in Munich. 2016-05-25 15:22:12 +02:00
Milan Hanajik 49ef7436b2 Component upgraded, RV feedback fixed. 2016-05-25 14:13:18 +02:00
Milan Hanajik 5ac9e40575 Writing into the OraDB fixed: new pruefindex is max. of pix-s from VT_ZAEHLER_PD and VT_ZAEHLER_PINDEX_PD + 1. 2016-05-25 13:18:34 +02:00
Milan Hanajik 00619ab2c6 Otput.FileWriters.Enhanced modified, makes 2 copies, filename can be formatter, header and footer added, ver.2.7.293 2016-05-25 11:00:18 +02:00
Milan Hanajik 5ebef2d27f Cleanup 2016-05-25 10:58:05 +02:00
Milan Hanajik 695a725b5f Implementing backward compatibility to WMeterRsltItemSpec, Units added to some ItemSpec column headers. 2016-05-25 10:57:30 +02:00
Milan Hanajik 6fda6dcabc ResultsWriters.Basic removed from the project 2016-05-24 17:21:55 +02:00
Milan Hanajik ef824531b8 More ControlComWrap logging as in iPerlST ver.2.4.292 2016-05-24 17:11:52 +02:00
Milan Hanajik 483218ef02 Output.FileWriter.Enhanced: (1) support for compound meters, (2) better localization, ver.2.7.291 2016-05-22 14:11:37 +02:00
Milan Hanajik 4ea85a0644 ResultsBrowser: Bench names can be configured. 2016-05-20 13:04:07 +02:00
Milan Hanajik 03a992d480 Munich printer process parameters removed, ver.2.7.290 2016-05-20 12:27:49 +02:00
Milan Hanajik 4a25dac8ff Preparation for DB migration Munich. 2016-05-20 11:02:54 +02:00
Milan Hanajik 1bcbe382d7 Munich: Changes in YearOfProduction (Eichjahr), Zaehlertyp, Pruefvorlage, etc., ver.2.7.289 2016-05-20 10:39:12 +02:00
Milan Hanajik 4ae4ba15cf DataEntry.Munich.CycleBeginningForm 'Height' fixed. 2016-05-20 08:53:30 +02:00
Milan Hanajik 775d3c67a4 WaterMeters.Munich with the smallest nr. of process parameters added. 2016-05-20 00:10:16 +02:00
Milan Hanajik ec82370934 Munich: Bug fixes after simulated tests. 2016-05-19 22:40:40 +02:00
Milan Hanajik baf87f63cc ProtocolTitle form Munich entry forms is saved in Batch data and used by Munich.Printer, ver.2.7.288 2016-05-19 21:22:17 +02:00
Milan Hanajik 4c2ef35ac1 Eichjahr (Year of production) can be changed in Munich CycleEnd forms. 2016-05-19 20:56:15 +02:00
Milan Hanajik 1b3fe413cb Munich specific changes. 2016-05-19 20:54:35 +02:00
Milan Hanajik 1af6a65a9f Munich component without 'Zobrazit Sim'. 2016-05-19 18:22:57 +02:00
Milan Hanajik cf57f3ab01 Bugfixes in: (1) DataEntry.Munich.EntryForm, (2) Screens.ProcessTabPage6,24,48, (3) DataEntry.Munich3 (cosmetical), ver.2.7.287 2016-05-19 17:29:02 +02:00
Milan Hanajik af0de8734a Munich.EntryForms support 4 protocols, ver.2.7.286 2016-05-19 15:51:06 +02:00
Milan Hanajik cd43aa2f42 Results screen fixed for compound meters, ver.2.7.285 2016-05-19 13:12:31 +02:00
Milan Hanajik be76fb4001 Munich/CycleBeginningForm localization modified. 2016-05-19 12:44:56 +02:00
Milan Hanajik 7c7f330a0b Progress bar fixed for Pressure and Leak test. 2016-05-19 12:43:45 +02:00
Milan Hanajik 3d844390e7 ProcessTabPageCtrl6 layout changes to cope with German texts, ver.2.7.285 2016-05-19 10:43:11 +02:00
Milan Hanajik ea7adb31a6 Changes done on the test bench GWZ-2. 2016-05-19 10:35:18 +02:00
Milan Hanajik 8a563a7729 Minor changes, ver.2.7.284 2016-05-19 09:54:41 +02:00
Milan Hanajik 78bcf73f13 ProcessTabPageCtrl6 localized via Strings.xy 2016-05-19 09:53:56 +02:00
Milan Hanajik b5b15b2988 Localization to German, other minor changes. 2016-05-18 19:19:31 +02:00
Milan Hanajik 1eee432993 Fixes for compound water meter results printing, results DB change, ver.2.7.283 2016-05-18 16:48:13 +02:00
Milan Hanajik dc5afadd53 Munich, ver.2.6.282 2016-05-18 11:23:52 +02:00
Milan Hanajik 643699161a Bug fix 2016-05-04 22:11:25 +02:00
Milan Hanajik ed996cc27e iPerlSpecial : Serial numbers can be entered at the end of the cycle, ver.2.6.281 2016-05-04 15:42:28 +02:00
Milan Hanajik 7a544495f2 Output.FileWriters.Basic appends to a file, iPerlSpecial bug fixes, ver.2.6.280 2016-05-04 15:16:14 +02:00
Milan Hanajik f44713eec3 ResultsConfigDlg : Up and Down buttons added, ver.2.6.279 2016-05-04 11:03:59 +02:00
Milan Hanajik dcd795b778 Description attribute for enums, Output.FileWriters.Basic: FileNameFormat, SaveGoodOnly, 2 destination folders, etc. 2016-05-03 19:00:15 +02:00
Milan Hanajik 08a404beab Output.FileWriter.Basic : Support for two destination folders. 2016-05-03 15:05:37 +02:00
Milan Hanajik 63099d27c5 ProcedureDlg fixes: support for two printers and four file writers, ver.2.6.278 2016-05-03 14:07:26 +02:00
Milan Hanajik 28b78c1345 Units for DN and L added (mm, cm, m, inch), WMeterRsltsItemSpec-s for many new output values added. 2016-05-02 15:26:14 +02:00
Milan Hanajik 6a4dff5cbc Added to IWaterMeter and Results.Entities.WaterMeterData: TempClass, MAP, Certificate, DN, L, Q4, Text1..5, etc, ver.2.6.277 2016-05-02 14:53:45 +02:00
Milan Hanajik 5239ed6d15 (1) formated date/time information in output items, (2) support for two printers and four file writers in procedure spec. 2016-05-02 10:19:26 +02:00
Milan Hanajik 7b878be87d iPerlSpecial: protocol changes, Results.Entities.WaterMeterData: Qn + Q3 -> Q3_Qn, ver.2.6.276 2016-05-01 10:04:05 +02:00
Milan Hanajik f746c9cd8f Output.FileWriter.Enhanced added to the project. 2016-04-29 17:21:23 +02:00
Milan Hanajik 25b8bd8469 Support for two file writers. 2016-04-29 17:10:17 +02:00
Milan Hanajik d1eb7b21d1 iPerlSpecial: Output.FileWriters.Basic rewritten to handle one water meter in one row (incl. fetch of test results). 2016-04-29 16:57:41 +02:00
Milan Hanajik 4ea8d66330 Bug fix: Output.FileWriters.Basic.WriterCfgCtrl: Selected items not updated. 2016-04-28 13:07:45 +02:00
Milan Hanajik ca0bcc49ac Calibration certificate nr., date, validity, etc. added to Metrology UI, FlowMeterCfg, ver.2.5.276 2016-04-28 12:47:23 +02:00
Milan Hanajik d516441ff8 Calibration certificate nr., date, validity, etc. added to Metrology UI, BalanceCfg, ver.2.5.275 2016-04-25 15:25:23 +02:00
Milan Hanajik df58d05b84 Buoyancy parameters added to the UI: Metrology tabs, BalanceCfg, BalanceDev. 2016-04-25 12:28:21 +02:00
Milan Hanajik ca2705421b Results.FileWriters.Basic added, ver.2.5.274 2016-04-24 18:49:14 +02:00
Milan Hanajik 291bb72cf5 iPerlCommunicationForm resized depending on the number of iPerl-s, gray color, ver.2.5.273 2016-04-23 14:32:15 +02:00
Milan Hanajik 7f3d1bb199 iPerlSpecial: MettlerToledo.Standard.BalanceDev bug fix, ver.2.5.272 2016-04-22 11:13:52 +02:00
Milan Hanajik a41d0517d2 Bug fixes in resources, ano/ne usage, etc., ver.2.5.271 2016-04-20 17:45:18 +02:00
Milan Hanajik d09921ee5b MettlerToledo.Standard.BalanceOld added, no response to "T<cr><lf>" command, ver.2.5.270 2016-04-20 16:16:55 +02:00
Milan Hanajik e88c34e2f4 iPerlSpecial: larger scale (WT1) serial protocol fix, TODO: fix WT2 serial protocol. 2016-04-20 15:07:25 +02:00
Milan Hanajik e09aad2a6d iPerlSpecial bug fix 2016-04-20 15:03:18 +02:00
Milan Hanajik 9500bc4656 More logging in RegulValve.SetFlowOp, ver.2.5.269. 2016-04-20 12:44:57 +02:00
Milan Hanajik a13c6a37fa iPerlSpecial component updated. 2016-04-19 12:32:51 +02:00
Milan Hanajik 1d924d7d40 iPerlSpecial modifications: RFID ports defined by watermeters, no Quido used, ver.2.5.268. 2016-04-19 10:10:51 +02:00
Milan Hanajik b1e0e74d8a iPerlSpecial modifications 2016-04-18 13:38:13 +02:00
Milan Hanajik c58f639346 (1) iPerlSpecial : WaterMeter/iPerl : RfidComPortNr added, (2) Comp. parameters dialog is unlocked when adding a component, (3) ValveCfgCtrl for 2s tick 2016-04-18 13:24:29 +02:00
Milan Hanajik f0e9b74132 New way of mass calculation temporarily disabled, bug fix in ResultsTabPageCtrl, ver.2.5.267. 2016-04-18 09:56:27 +02:00
Milan Hanajik 9a725de4a9 Stable mass measurement rewritten, it can use immediate measurement, DB change, ver.2.5.265. 2016-04-14 17:03:33 +02:00
Milan Hanajik 6efa998532 Logging of a STOP command, ver.2.4.264. 2016-04-14 12:29:14 +02:00
Milan Hanajik 2d877877e2 iPerlST: Limits for Q when saving WM test result into Oracle DB introduced, ver.2.4.264. 2016-04-14 12:01:50 +02:00
Milan Hanajik e037720115 iPerlST: Logging of a STOP command via UI. 2016-04-14 09:16:20 +02:00
Milan Hanajik fdd4036797 iPerlST bug fix: User number = 6 when a new user is created, ver.2.4.262. 2016-04-11 12:28:40 +02:00
Milan Hanajik e001d01f15 ver.2.4.261. 2016-04-11 11:45:45 +02:00
Milan Hanajik efad9eb0d9 Bug fixed in continuation of the cycle after a STOP. 2016-04-11 09:39:02 +02:00
Milan Hanajik f6169c962d Czech BenchControlPanel. 2016-04-11 08:50:48 +02:00
Milan Hanajik b073e322d4 iPerlST: Component updated, RV state in SetFlowOp re-enabled. 2016-04-10 21:30:24 +02:00
Milan Hanajik f901367817 iPerl ST component, symbol IPERLST_SPECIAL, etc. added to the project, ver. 2.4.260. 2016-04-07 15:37:49 +02:00
Milan Hanajik e94443ad8a Possibility to continue in the cycle when selecting a test, ver.2.4.259. 2016-04-07 14:53:34 +02:00
Milan Hanajik 2d20ea1196 (1) power users obtain nr.6 on startup, (2) maxBatchNr from DB detected and used, (3) more logging, ver. 2.4.258. 2016-04-07 13:52:57 +02:00
Milan Hanajik a275a911f6 Oracle DB changes, language resources exported, etc., ver.2.4.257. 2016-04-06 14:15:17 +02:00
Milan Hanajik 1f08cf0b81 Corrects a bug in iPerlST component (?), ver.2.4.256. 2016-04-04 21:52:08 +02:00
Milan Hanajik 2a3f76c3dc iPerlST component dated 160304, ver.2.4.255. 2016-04-04 11:26:12 +02:00
Milan Hanajik 45c6c10755 ver.2.4.254. 2016-03-23 11:24:42 +01:00
Milan Hanajik 5a265d4ef6 ResultsBrowser: Three benches are supported, ParseAllFields() function. 2016-03-18 18:17:15 +08:00
Milan Hanajik 63c12958f7 ResultsBrowser: RBrowserWnd added, ver. RB2.4.250. 2016-03-18 15:53:33 +08:00
Milan Hanajik 809c16e1e1 ver.2.4.253. 2016-03-18 14:25:09 +08:00
Milan Hanajik dc9b72f487 ver.2.4.252. 2016-03-18 13:42:33 +08:00
Milan Hanajik 2bf0ab226f Bug fixes in DB mapping, ver.2.4.251. 2016-03-18 13:16:53 +08:00
Milan Hanajik 0c2c9bb1e2 User.UserNumber and BenchPath.StopFBValve introduced and used, database 2.4 2016-03-18 12:44:25 +08:00
Milan Hanajik b006e36d52 Stop Backflow Valve added, used in FlyingStartMassCollection method, ver.2.4.248. 2016-03-18 10:36:33 +08:00
Milan Hanajik 2392bfa2a7 FlyingStartCollectionMethod timing modified, start valve used, ver.2.3.245. 2016-03-17 13:02:25 +08:00
Milan Hanajik 16ef6bde34 Czech translations 2016-03-16 23:51:10 +08:00
Milan Hanajik 933909c1e9 try-catch in ProcesstabPageCtrlXX handlers 2016-03-16 21:36:44 +08:00
Milan Hanajik a9c7e1fa25 Chinese translations, part 2 2016-03-16 21:23:49 +08:00
Milan Hanajik aee1990243 Chinese translations, part 1 2016-03-16 20:47:10 +08:00
Milan Hanajik 88caba317b ver.2.3.243. 2016-03-16 07:52:52 +08:00
Milan Hanajik 3843b16587 Bug fix: Results were not redrawn after a test automatically. 2016-03-16 07:49:51 +08:00
Milan Hanajik b86ca9fac8 Active FM pump is switched off in 'default action' after test (not when transition sequences are used), ver.2.3.242. 2016-03-15 19:29:47 +08:00
Milan Hanajik 1fb82dad92 Sequence before test modification: Test paths (input, bench, output) are applied after the last step. 2016-03-15 16:06:44 +08:00
Milan Hanajik b879245df2 Fuzhou: All three components updated. 2016-03-15 15:31:58 +08:00
Milan Hanajik 224c9c4372 Fuzhou: Bug-fix in results printers when tests do not fit onto one page, ver.2.3.241. 2016-03-15 15:31:32 +08:00
Milan Hanajik c16964c1de iPerlST: Pressure added to LU logging, ver. 2.3.240. 2016-03-15 11:17:49 +08:00
Milan Hanajik 1d52047559 The correct Fuzhou PT150 component restored, ver.2.3.238. 2016-03-15 09:58:26 +08:00
Milan Hanajik 0b9fd8712a Language resources exported, ver.2.3.237. 2016-03-14 15:51:09 +08:00
Milan Hanajik edf53a91f9 Fuzhou 50, ver. 2.3.236. 2016-03-14 11:11:40 +08:00
Milan Hanajik 5884f282e4 LU logging bug fix, ver.2.3.235. 2016-03-10 10:12:15 +01:00
Milan Hanajik b6e368938d iPerl component 151109 used. 2016-03-07 09:28:41 +01:00
Milan Hanajik e7fa371c1b iPerl component 151124 used. 2016-03-07 09:16:06 +01:00
Milan Hanajik 270c3b0aae LU logging modification 2016-03-07 09:08:32 +01:00
Milan Hanajik 27e0cd3b53 iPerlST component updated 2016-03-07 08:59:23 +01:00
Milan Hanajik 8ff2ff0c38 Puchong component upgraded, ver.2.3.234. 2016-03-03 19:47:19 +01:00
Milan Hanajik 6c0c89a0dc Torino, ver.2.3.233. 2016-03-03 15:09:49 +01:00
Milan Hanajik e264f3b3dd DIFF2HZ8HZ limitted to range -99 .. +99 before writing into OraDB, ver.2.3.232. 2016-03-03 14:43:11 +01:00
Milan Hanajik e3605b647c LU logging fixed, ver.2.3.231. 2016-03-02 20:02:30 +01:00
Milan Hanajik 25eff13c41 Bug fix in iPerl communication when L1 only or L2 only used. 2016-03-01 18:57:36 +01:00
Milan Hanajik d2493b0331 Bug fix: padlo v Active mode na konci cyklu, ver.2.3.230. 2016-03-01 16:22:49 +01:00
Milan Hanajik 82cede65ef CEVAK component upgraded, ver.2.3.229. 2016-03-01 11:05:26 +01:00
Milan Hanajik 3549376f34 RersultsPrinter.Basic, RersultsPrinter.Cevak and ResultsWriter.Basic modified to print only Publish.Always tests. Publish.None --> Publish.Never. 2016-02-29 19:03:17 +01:00
Milan Hanajik 7b61f7cb86 Type of 'Publish' changed to sbyte, ver.2.3.228. 2016-02-29 15:44:30 +01:00
Milan Hanajik 87b5c36e6a Working on Ajustment, ver.2.3.227. 2016-02-29 15:31:22 +01:00
Milan Hanajik 5c48dbf60e Basic results printer modified as well. 2016-02-24 22:55:40 +01:00
Milan Hanajik cc789ee7e0 Cevak results printer modifications, ver. 2.2.227. 2016-02-23 21:12:17 +01:00
Milan Hanajik 087870b1ec Prebuildovane pre Puchong, ver.2.2.226. 2016-02-19 18:32:44 +01:00
Milan Hanajik 393bc99d9b Viac Previous results - 25 batchov, ver. 2.2.225. 2016-02-19 18:28:41 +01:00
Milan Hanajik 93b40740b5 SafeMode for Save previous results, version 2.2.224. 2016-02-19 17:53:43 +01:00
Milan Hanajik 140ec13626 CEVAK bug fixes, version 2.2.223. 2016-02-19 15:20:44 +01:00
Milan Hanajik 2cab985bd0 ResultsPrinter.Cevak implemented, bug fixes in ResultsPrinter.Basic. Bug fixes in EntryForms (Purchase order via UpdateTestResultss(..)), version 2.2.222. 2016-02-19 14:25:59 +01:00
Milan Hanajik 4ab889b43e Publish, Evaluate test parameters of the Flying start mass collection method excluded. 2016-02-19 10:43:42 +01:00
Milan Hanajik cd52a11d0e BenchInfoPL ==> BenchInfoEx, ResultsPrinter.Cevak added, version 2.2.221. 2016-02-19 09:55:37 +01:00
Milan Hanajik 014ec3924f LU logger bug fix. version 2.2.220. 2016-02-18 01:51:54 +01:00
Milan Hanajik a62ce451c4 LU iPearl logging implemented, version 2.2.219. 2016-02-18 01:08:14 +01:00
Milan Hanajik 7badb8ef7b Released for Puchong, version 2.2.218 2016-02-16 18:01:27 +01:00
Milan Hanajik 4d39805ef4 Bug fixes: (1) in MainSeq when starting iPearlCommForm, (2) in SetActiveMode (config struct was null), version 2.2.217. 2016-02-16 17:25:01 +01:00
Milan Hanajik 4b1a684d69 2Hz correction related changes: iPerlCommunication: 'Reset 2Hz correction', 'Write 2Hz correction' + OraDB changes. 2016-02-16 14:44:10 +01:00
Milan Hanajik a22b4de1b6 FlyingStart measurement during test simplified similarly to FlyingStartMassCollection, version 2.1.215. 2016-02-16 12:28:36 +01:00
Milan Hanajik 462ed568de Bug fixes: (1) simulation, (2) when BenchInfo==null, (3) ProcessData.RefPulses updated, (4) ProcessTabPages, etc. 2016-02-15 22:48:44 +01:00
Milan Hanajik 92bcd46549 Working on 2Hz correction 2016-02-15 15:16:44 +01:00
Milan Hanajik e22d58101c Correct start-up message when there is no CB component, version 2.1.214 2016-02-14 23:17:02 +01:00
Milan Hanajik 193ede3d55 Changes for Puchong PT200 test bench added. 2016-02-14 16:35:41 +01:00
Milan Hanajik edc4d59f90 Process data screen update when test completed, version 2.1.213. 2016-02-13 19:28:33 +01:00
Milan Hanajik 56e38831f1 TestResult2CsvLine(..) format reverted to the original one (place for diverter data). 2016-02-13 17:45:19 +01:00
Milan Hanajik 6a159f773e WMPulses[], WMRefPulses[], WMTimes[] removed from SequenceBase, operations, etc., clean-up. 2016-02-13 17:39:38 +01:00
Milan Hanajik e94e16c9e6 Use of ProcessData.RegisterReaders in iPerlCommunicationForm. 2016-02-13 16:40:26 +01:00
Milan Hanajik e70e5f7cb4 WMVolumes[], WMErrors[] eliminated from SequenceBase, etc. 2016-02-13 15:53:21 +01:00
Milan Hanajik 3946d26cb4 IRegisterReader extended, ReadReferenceForRegisterOp removed, ReadRegisteOp integrated into RegisterReader class, ProcessTabPages updated. 2016-02-13 15:02:10 +01:00
Milan Hanajik 7534fc7c24 Removed WMPulses and WMRefPulses logs. 2016-02-13 08:11:50 +01:00
Milan Hanajik 766562fb7d iPearlST OraDB bug fix, version 2.1.212. 2016-02-10 22:20:15 +01:00
Milan Hanajik 2c1e4e7d26 Process data display : many changes, TODO: Meter data and the end of test. 2016-02-10 19:24:10 +01:00
Milan Hanajik 3775913a33 Reconfigured for iPerlST, ProcessDataEventArgs related modifictions. 2016-02-10 16:52:59 +01:00
Milan Hanajik 42a9ecda27 iPearl ST: More PreviousResultsDlg changes, Test database can be used, etc. 2016-02-09 15:04:18 +01:00
Milan Hanajik eafa88258f Change in logging levels. 2016-02-09 14:33:34 +01:00
Milan Hanajik 9a143bd266 iPearl ST: OraDB: More logging and bugfix, version 2 1 211. 2016-02-09 14:30:21 +01:00
Milan Hanajik b6c9c8cf22 PreviousResultsDlg and related changes, version 2.1.211 2016-02-09 08:31:14 +01:00
Milan Hanajik f31843f665 ProcessDataEventArgs added. 2016-02-08 23:33:23 +01:00
Milan Hanajik 6e2bf48b43 (1) State of the RegulValve checked after ValveMove (#, position, ...), (2) RFID results are saved only when SimultWithPrevious == true. 2016-02-08 17:49:49 +01:00
Milan Hanajik 1278a2365d LU logging added to SensusOracle DB (content of logging to be completed). 2016-02-08 16:34:37 +01:00
Milan Hanajik 3407b51c27 All changes done for Badger-velka-trat merged into this branch, version 2.1.210. 2016-02-07 22:55:48 +01:00
Milan Hanajik adb37826a5 Mettler-Toledo Multi protocol change as in v.2.0.195 (Badger), Immediate meas. works, TODO: stable meas. 2016-01-26 13:43:47 +01:00
Milan Hanajik 0fdcbffcae Minor changes: (1) introductory logging, (2) simulation for Badger velka trat. 2016-01-26 13:39:51 +01:00
Milan Hanajik d575220aec Bug fix in relative transitions UI, PumpPower with 1 decimal digit (Badger velka trat). 2016-01-26 13:34:19 +01:00
Milan Hanajik 69de3b038a Badger bug fixes: coax. reg. valve (index out of range), novy komponent. 2016-01-26 13:26:03 +01:00
Milan Hanajik 773a1f2d15 Oracle DB hotfix as in ver. 2.1.194. 2016-01-26 13:19:55 +01:00
Milan Hanajik a4331c8267 Fixes occasional problem/crash for an iPearl test with Parts when iPearls are activated after 'End', version 2.1.190. 2016-01-19 21:12:35 +01:00
Milan Hanajik bfa506911c ResultsBrowser ver.2.1.189: Purchase order read from the Oracle DB. 2016-01-19 13:02:06 +01:00
unknown a2432927ee Bug fixes: ResultsBrowser: open cursors, query procedure, etc, TBF: Saving to disk. version 2.1.188. 2016-01-16 16:58:41 +01:00
Milan Hanajik 126a0e2663 ResultsBrowser bug fix 2016-01-15 00:28:55 +01:00
Milan Hanajik f3f6ad4291 ResultsBrowser changes, ver. 2.1.187 2016-01-14 23:59:53 +01:00
Milan Hanajik ffc70efaf4 Writing Q2 correction into Oracle DB fixed (MaxPruefindex w/o %100), version 2.1.187. 2016-01-14 21:50:39 +01:00
Milan Hanajik 951a62ad06 ResultsBrowser rewritten for the new Results DB, version 2.1.186. 2016-01-13 23:38:18 +01:00
Milan Hanajik d8d8f24843 Bug fix in Progress display for a test with parts, version 2.1.186. 2016-01-12 20:46:37 +01:00
Milan Hanajik c75e88c871 Bug fix in Results for tests with Parts, mappings were removed, version 2.1.185. 2016-01-12 20:21:17 +01:00
Milan Hanajik 47af8c11d3 Code to modify 'Publish' and 'Evaluate' properties of iPearl tests added, version 2.1.184. 2016-01-11 13:39:43 +01:00
Milan Hanajik 6c85732748 Minor change: OracleDB saved first, then results are written to HDD. 2016-01-10 14:13:33 +01:00
Milan Hanajik 8cd3b6a7b0 Bug fix: Procedure parameters were not loaded early enough. 2016-01-10 13:15:14 +01:00
Milan Hanajik d1ef582349 Bug fix: WMTypeId and WMTypeRev in Results.Entities.WaterMeterData were not initialized. 2016-01-10 13:02:26 +01:00
Milan Hanajik 6d47789708 Procedure settings conversion code (to be completed). 2016-01-10 12:40:15 +01:00
Milan Hanajik 66a31fc1e9 Serious iPearl bug fix, flow setting timeout time increased, version 2.1.183. 2016-01-10 12:39:20 +01:00
Milan Hanajik d84c3ca4d8 Cosmetical changes (progress for modeless form sometimes not completed) 2016-01-10 01:44:28 +01:00
Milan Hanajik 98c8b0e7a8 iPearl debugging, progress management, OracleDB simulation, etc, version 2.1.182 2016-01-09 20:06:59 +01:00
Milan Hanajik 68c4bf5956 Separate string SerialNrAux and int SerialNrEx in Results. Other fixes. Version 2.1.180 2016-01-08 17:10:05 +01:00
Milan Hanajik b131ba01a8 Batch results written into the built in Results database. 2016-01-08 13:51:54 +01:00
Milan Hanajik f5642a2676 OracleDB modified for new Results, other changes and fixes, version 2.1.172. 2016-01-08 10:23:36 +01:00
Milan Hanajik 1585066b57 DB.SensusOracle: saving to disk re-implemented, other minor changes and fixes. TODO: Oracle DB. 2016-01-06 22:37:19 +01:00
Milan Hanajik 1ee5724082 All printers modified for new Results, other fixes and changes. 2016-01-06 21:39:52 +01:00
Milan Hanajik 511d86a186 Results on screen modified to accept new Results. ItemSpec introduced. 2016-01-04 23:39:28 +01:00
Milan Hanajik d91ca4b56b All entry forms modified to use Result.Entities.WaterMeter, EndStateAux introduced. TODO: display, saving, printing. 2016-01-04 17:55:39 +01:00
Milan Hanajik e14dc37060 TestCompletedEventArgs modification 2016-01-04 16:03:17 +01:00
Milan Hanajik 1e058726d4 Adjustment modified to use the new Results. 2016-01-04 15:24:16 +01:00
Milan Hanajik 26982a5729 Many changes, new results used, all test sequences modified, simulated tests rewritten. 2016-01-04 13:53:45 +01:00
Milan Hanajik 494c6edf76 Results.BatchResults.NewFromProcedure(...) added, BenchId -> TestBenchId, BenchName -> TestBenchName, etc. 2016-01-02 19:21:43 +01:00
Milan Hanajik 61bfa51fa7 Uncertainty used when evaluating tests, in TestWizard, UI, etc., version 2.1.171. 2016-01-02 11:11:45 +01:00
Milan Hanajik 81fe244c23 Test.Publish and Test.Evaluate added, other Results DB related changes. 2016-01-02 00:54:21 +01:00
Milan Hanajik 98f74fa971 Many fixes, Results.Entities.Components added, builds OK, creates the results DB. 2016-01-01 20:27:59 +01:00
Milan Hanajik bb260426c9 Database settings changes 2015-12-31 22:48:22 +01:00
Milan Hanajik 02b31634f8 DBTypes to Config.Entities.Enums.cs 2015-12-31 18:20:03 +01:00
Milan Hanajik 35c449bd0c Results.Entities and Mappings added, Results.DB (based on FluentCommon). 2015-12-31 16:45:59 +01:00
Milan Hanajik 2b7f6a8dac Fluent common database bugfix. 2015-12-31 16:45:55 +01:00
Milan Hanajik 2a4eeb2d77 One more fix. 2015-12-29 19:03:22 +01:00
Milan Hanajik a08be1ee73 ResultsBrowser: query by BatchNr range added. 2015-12-21 20:32:36 +01:00
Milan Hanajik 21390eaba6 Fixes a bug in Badger on 21.12.2015 when saving results, version 2.0.170 2015-12-21 12:21:47 +01:00
Milan Hanajik 5f0c56b19f Measured flow into OptoTelegramRaw bugfix, version 2.0.169. 2015-12-21 10:09:44 +01:00
Milan Hanajik 714780d0b6 StopPreviousOp modified to re-send command if necessary. 2015-12-20 22:14:18 +01:00
Milan Hanajik d852e390b3 Flow measured by reference flowmeter into OptoTelegramRaw and opto-data logs. 2015-12-20 21:12:00 +01:00
Milan Hanajik bb2087c002 ProcessData base class with 'public static' process data introduced. 2015-12-20 20:48:50 +01:00
Milan Hanajik 15ac3608c4 Default values of 'Publish' and 'Evaluate' = yes, program version shown in LoginDlg title. 2015-12-20 13:52:26 +01:00
Milan Hanajik e4e8c97cfd SensusOracleDatabase code cleanup, version 2.0.168 2015-12-20 11:59:25 +01:00
Milan Hanajik 3ef8674caf ResultsBrowser used to generate report for the customer for 179 watermeters, TBF v. 2.0.167, Results v.2.0.2. 2015-12-18 17:43:38 +01:00
Milan Hanajik 58a2be10aa Decimal numbers in OptoData logfiles use commas instead of dots, Delta time fixed, test start/end labels added. 2015-12-17 14:38:46 +01:00
Milan Hanajik bcae594b3f WaterMeterResults -> Results, etc. 2015-12-17 09:31:41 +01:00
Milan Hanajik 763acec379 Way of querying serial numbers form Oracle DB changed. 2015-12-16 10:51:35 +01:00
Milan Hanajik 12bd4e80dd Many various changes. 2015-12-15 04:16:53 +01:00
Milan Hanajik 4f456e0c40 DataDeposit and WaterMeterResult added. Procedure selection criteria added. 2015-12-15 01:57:52 +01:00
Milan Hanajik c6ef378bc9 MySQL query works OK. 2015-12-14 19:19:48 +01:00
Milan Hanajik 9689080387 ResultsBrowser works, MySQL DB opens, Oracle DB in TBF works in 64-bit OS, TBF v.2.0.165. 2015-12-13 09:37:48 +01:00
Milan Hanajik 6ecddf07f6 ResultsBrowser re-created. 2015-12-12 23:54:22 +01:00
Milan Hanajik 89ecf478ba ResultsBrowser changes (does not run correctly). 2015-12-10 22:17:47 +01:00
Milan Hanajik d9e7efa15a TestBenchFramework project, resources changes 2015-12-10 22:16:38 +01:00
Milan Hanajik 6e6edde77f (1) MunichPrintDocument fixed for three single water meters: 3 pages printed. (2) Cycle end form fixed (end state). (3) DE 2015-12-09 16:12:06 +01:00
Milan Hanajik b2c944f9b1 Change of logic for 'disabled' water meters in LabelPrinter, version 2.0.164. 2015-12-09 14:31:40 +01:00
Milan Hanajik 852ffd0602 LabelPrinter component clean-up, disabled single watermeters are not printed. 2015-12-09 00:31:59 +01:00
Milan Hanajik a06fe00440 Label printer added, version 2.0.163. 2015-12-08 23:44:52 +01:00
Milan Hanajik 8c1c5ed4f0 Bugfix in FixedStartCombinedMeters test method and Combined/EntryForm, version 2.0.162. 2015-12-08 17:59:25 +01:00
Milan Hanajik 123187aa8a Version 2.0.159. 2015-12-08 11:16:19 +01:00
Milan Hanajik 644c26355c iPerl opto data file name setting bug fix (FlyingStartSeq). 2015-12-08 10:48:06 +01:00
Milan Hanajik 432b288c34 DB works OK, project changes, MessageBox when database cannot be open. 2015-12-06 21:26:42 +01:00
Milan Hanajik f6cec9d769 'Config', 'Results' projects added, includes iPerl opto logging bug-fixes, builds OK, cannot open DB, version 2.0.158. 2015-12-05 14:18:36 +01:00
Milan Hanajik 29ece2f91c iPerl opto data logging: calculated data added, TODO: (1) ref.flow, (2) start/end mark. 2015-12-04 13:52:00 +01:00
Milan Hanajik e3aa3f6721 Water meter data cleared at the beginning of each cycle. 2015-12-04 12:24:55 +01:00
Milan Hanajik b1ccdcb5c1 Procedure combo box and progress bar in MainWnd stretched. 2015-12-03 23:37:14 +01:00
Milan Hanajik a541ac4945 'Counter' value added to opto data logging, version 1.6.154. 2015-12-03 20:58:54 +01:00
Milan Hanajik 38cbcb6430 iPerl opto data logging format changed, version 1.6.153. 2015-12-02 18:03:37 +01:00
Milan Hanajik c593ed903e Diverter ADC calibration values used to initialize RegValveCalib[,] array, version 1.6.152. 2015-12-02 14:10:54 +01:00
Milan Hanajik d488f62648 Initial version for Fuzhou PT40, component, defines, etc. 2015-12-02 13:25:40 +01:00
Milan Hanajik aefbcdb2a0 'Measurement' menu item and tab page removed, 'Pictures' menu item added by code optionally (#if CAMERA). 2015-12-02 08:24:05 +01:00
Milan Hanajik c1bdb53a4d Version 1.6.150. 2015-12-01 22:28:36 +01:00
Milan Hanajik 38dc09af7f German version of 'Break' button OK. 2015-12-01 22:18:12 +01:00
Milan Hanajik d83b497fa0 Problems with 'standrohre' test results (parts) and test names in BenchControlPanel fixed, version 1.6.149. 2015-12-01 22:03:53 +01:00
Milan Hanajik 5b31a94b74 Modifications for initial version of BADGER-VELKA-TRAT, version 1.6.148. 2015-12-01 10:38:28 +01:00
Milan Hanajik ee1afaa78b DiverterEdge[] initialization for SendCalibData() fn fixed, version 1.6.147. 2015-11-27 16:41:40 +01:00
Milan Hanajik 910d5d58dc Component updated 2015-11-27 15:58:03 +01:00
Milan Hanajik 6dfba78dbf Communication column removed from TransitionStep table. 2015-11-27 15:58:01 +01:00
Milan Hanajik cd98f30ad2 Uncertainty added to Test and TestResult tables. 2015-11-27 15:58:00 +01:00
Milan Hanajik 893b7af55a Procedure History and related DB changes, version 1.6.146. 2015-11-27 15:57:06 +01:00
Milan Hanajik 3bb8cb2ab7 iPerl DN40 hotfix?, version 1.5.145. 2015-11-25 08:53:40 +01:00
Milan Hanajik 22b1fbca90 Exception logging in MainSeq.OpenIPerlCommForm{} 2015-11-23 20:31:01 +01:00
Milan Hanajik ddcfa71273 Column withs in Components and Procedures forms are saved, version 1.5.144. 2015-11-23 15:12:39 +01:00
Milan Hanajik 8d123d306f Flying start method (without use of a scale) modified for iPerl, version 1.5.143. 2015-11-19 18:49:15 +01:00
Milan Hanajik a380a68855 SampleConfig files updated 2015-11-18 08:54:19 +01:00
Milan Hanajik 39d0a73e39 TBFSetup configuration changed, version 1.5.142. 2015-11-17 23:53:40 +01:00
Milan Hanajik a01f99fa7e iPerl flow direction determination, saved into Oracle DB. 2015-11-13 01:11:36 +01:00
Milan Hanajik 8a0411bd92 Writing into VT_PRUEFREIHE_PD added, version 1.5.141. 2015-11-13 00:03:33 +01:00
Milan Hanajik 8cd4f12de3 Oracle DB exceptions logging, version 1.5.140. 2015-11-12 19:48:29 +01:00
Milan Hanajik 4a528dafb8 Oracle database test results bug fix: measured flow in l/h, version 1.5.139. 2015-11-11 16:40:13 +01:00
Milan Hanajik b3a9302f53 Test results are written into the Oracle database..WaterMeters.iPerl process parameters added. 2015-11-11 12:44:37 +01:00
Milan Hanajik 575b17a919 iPerlST component updated, version 1.5.138 2015-11-10 09:48:21 +01:00
Milan Hanajik 41433329da Bux fix in Torino simulation, version 1.5.137. 2015-11-05 18:25:09 +01:00
Milan Hanajik e52f9ea9e7 Make Q2 correction from ... modifications, no Q2 factors written in case of large error, version. 1.5.136 2015-10-23 18:32:58 +02:00
Milan Hanajik 1892f9de9f Oracle DB 'Update' (when testing a water meter for the 2nd time) works well, version 1.5.134 2015-10-23 15:08:49 +02:00
Milan Hanajik db0c850d70 Romanian strings added (MURES). 2015-10-21 11:48:57 +02:00
Milan Hanajik 060aba08a9 Behavior of Elde.PumpWithFM.TurnOn(pumpPower) fixed: pump power change forces sending a command. 2015-10-21 09:54:41 +02:00
Milan Hanajik 5ac7572a3d MURES component updated, SetFlowOp watches StatusP.RefPulsesMsrmnt flag, version 1.5.133. 2015-10-21 09:51:38 +02:00
Milan Hanajik c9e2742745 Bugfix, version 1.5.132. 2015-10-21 07:49:42 +02:00
Milan Hanajik 5a77c5f660 iPerl parameters FactorLimitLo, FactorLimitHi moved to iPerlCommunication (arguments in the activity string), version 1.5.131. 2015-10-16 11:24:03 +02:00
Milan Hanajik 1301db3af4 MURES component upgraded, version 1.5.130. 2015-10-15 21:48:45 +02:00
Milan Hanajik 2cd877fb17 SetFlowOp with verification and re-sending the command. 2015-10-15 19:50:26 +02:00
Milan Hanajik 9dc3759f99 Added to summary/all results: (1) reference flow meter number (MID), (2) ref. density, (3) @temperature 2015-10-14 21:40:16 +02:00
Milan Hanajik 66f1bfa14b Transition sequence 'New': (1) generated name# is incremented, (2) name checked for uniqueness, (3) fixed size form without maximize/minimize buttons, (4) 'x' works correctly (as Cancel). 2015-10-14 16:50:35 +02:00
Milan Hanajik d7c262c87a Emptying the tank displays remaining time in min and sec. 2015-10-14 15:45:51 +02:00
Milan Hanajik 02da6ae134 Default serial port settings of Comet Ambient sensor changed 2015-10-14 13:52:52 +02:00
Milan Hanajik 3336454719 Language resources exported. 2015-10-09 07:58:17 +02:00
Milan Hanajik 5967db86a1 Sk, Ro strings added. Many German resource files removed from the project. Localization done via strings. 2015-10-08 00:14:21 +02:00
Milan Hanajik 2acd67707e FixedStartAdvanced test method added. 2015-10-05 11:24:06 +02:00
Milan Hanajik 70f38e9352 Adjustment test method/adjustment form supports 10-12 water metes, version 1.5.129. 2015-10-05 09:59:27 +02:00
Milan Hanajik 687e843e5f Version 1.5.128 2015-10-04 22:52:18 +02:00
Milan Hanajik 43eaa61007 Adjustment test method for 24 WMs fixed, MakeSimulated(..) and MakeSimulatedCompound(..) moved to SequenceBase, version 1.5.127. 2015-10-04 22:41:52 +02:00
Milan Hanajik 518d87afe1 Added support for MURES_PT40, defines, component, version 1.5.125. 2015-09-26 20:59:31 +02:00
Milan Hanajik f2676993b1 Results from pressure and leak tests fixed for compound meters, version 1.5.124. 2015-09-25 10:15:46 +02:00
Milan Hanajik 786485f566 Language and layout changes for German. 2015-09-25 09:22:11 +02:00
Milan Hanajik e3df943946 Serious bug fixes: Leak and pressure tests did not use correct MetersKind info when saving results. 2015-09-25 09:21:37 +02:00
Milan Hanajik bdd2f5f89d Pre-selected water meter type when opening results page configuration. 2015-09-24 19:11:42 +02:00
Milan Hanajik 6318ce7700 Munich Printer page orientation can be selected in component properties, version 1.5.122. 2015-09-24 18:59:42 +02:00
Milan Hanajik 5e9f9e7425 Bug fix in Basic Results Writer: program crash when no items were selected. 2015-09-24 18:58:36 +02:00
Milan Hanajik 7ca07d78c6 Compound meter test simulations added to iPerlCommunication method. 2015-09-24 18:57:14 +02:00
Milan Hanajik 69a51908c2 DataEntry.Standars48.CycleBeginningForm completed, TODO: TestStartEndForm. 2015-09-22 20:38:35 +02:00
Milan Hanajik 656ef27a3b Flow control during a test - process data logging improvement 2015-09-22 20:37:32 +02:00
Milan Hanajik 72754ebe10 Flow control during a test, version 1.5.121. 2015-09-22 18:39:00 +02:00
Milan Hanajik d7e6a69ca9 StartMeasurementOp interface changed: OutputPath is the first argment 2015-09-22 17:03:26 +02:00
Milan Hanajik 2985338d7e DataEntry.Standard12 and DataEntry.Standard48 added, TODO: complete Standard48. 2015-09-22 14:01:43 +02:00
Milan Hanajik 120c1cc39d Remaining test time is shown in minutes and seconds. 2015-09-22 11:35:44 +02:00
Milan Hanajik f203c56e8b Program is protected against Ambient sensor serial port failure, version 1.5.120. 2015-09-22 11:35:43 +02:00
Milan Hanajik b3dc49e8b7 Flushed opto-data indication in iPerlCommunicationsForm, version 1.5.119. 2015-09-22 11:35:17 +02:00
Milan Hanajik 8c796eaeee Setting the flow - an attempt to solve bug, version 1.5.116. 2015-09-18 07:46:57 +02:00
Milan Hanajik c45f8298ac ResultsPrinters.Basic support for: (1) multiple pages, (2) page orientation, (3) top margin. 2015-09-18 00:10:06 +02:00
Milan Hanajik 4a35215be9 Adjustment for 24 water meters, fixed a bug in trransition sequence editor, version 1.5.115. 2015-09-17 20:58:56 +02:00
Milan Hanajik 62cd81b5f7 Defines re-arranged so that new benches do not require any modification, bug in BADGER fixed. 2015-09-17 19:14:18 +02:00
Milan Hanajik 7afb780d5b More RFID comm. logging, 'Set active mode' executed also when wm.CommFailed == true, version 1.5.114. 2015-09-16 16:30:30 +02:00
Milan Hanajik cdb8304287 Oracle DataAccess added to references, DLL added to packages/..., version 1.5.113. 2015-09-14 23:08:57 +02:00
Milan Hanajik ebda3f5127 Bug fix: iPerlCommunication simultaneously with evacuation repeated 2x, version 1.5.112. 2015-09-14 10:25:41 +02:00
Milan Hanajik 06c46785f6 (1) bug fixes, (2) common iPerlCommunication test result derived from the 1st test (Read configuration), version 1.5.111. 2015-09-11 19:36:37 +02:00
Milan Hanajik e230ce02bf 'CommFailed' flag in iPerl.WaterMeter, 'Disabled' not used for this purpose, all 40 meters displayed in results, version 1.5.109. 2015-09-11 14:15:32 +02:00
Milan Hanajik 2a0fbca1e0 Baujahr written into Oracle database 2015-09-11 08:23:13 +02:00
Milan Hanajik 2845cf20f5 iPerlCommunication simultaneously with evacuation (SimultWithNext test parameter), version 1.5.108. 2015-09-10 20:07:06 +02:00
Milan Hanajik e9440411bc RFID communication properties are iPerlCommunication component parameters. 2015-09-06 23:36:14 +02:00
Milan Hanajik d041cd1d20 Evaluate and Publish properties of test methods changed to stateless functions Evaluate(test) and Publish(test), this fixes results, version 1.5.107 2015-09-06 22:21:54 +02:00
Milan Hanajik 264830a36b iPerlCommunication simultaneously with purging fixed II., Invoke( ) in MainSeq. 2015-09-06 00:09:52 +02:00
Milan Hanajik 558f000198 iPerlCommunication simultaneously with purging fixed, uses IParamsProvider.Clone(). 2015-09-05 12:19:11 +02:00
Milan Hanajik cb4833664c Clone( ) function added to IParamsProvider and all procedure/test parameters classes. 2015-09-05 12:18:09 +02:00
Milan Hanajik d5cb6ca71b iPerlCommunication simultaneously with purging, STOP button function fixed, version 1.5.106 2015-09-05 09:58:01 +02:00
Milan Hanajik 7827fa4e5b Minor fix in FlyingStartCollectionMethod. 2015-09-04 13:47:41 +02:00
Milan Hanajik d1944753b3 Bug fix: When new test was added to a procedure, test parameters were not created correctly (strange iPerlCommunication activity after Add). 2015-08-30 08:31:53 +02:00
Milan Hanajik c6007d3b6a Check done on startup whether all RFID serial ports are free, version 1.5.105 2015-08-30 07:21:37 +02:00
Milan Hanajik 91a4ca3760 Q2 correction factor logging and display improvements, bug fix in iPerlCommunication, Action="Simulate Q#", version 1.5.103. 2015-08-27 07:03:42 +02:00
Milan Hanajik 36e0c177c7 Q@ correction logging in summary results, version 1.5.102. 2015-08-26 18:59:38 +02:00
Milan Hanajik e13b553ab5 iPerl.WaterMeter: Q2 correction with limits given by Q2adj error limits 2015-08-26 18:18:23 +02:00
Milan Hanajik 2799522a22 "Q2 corrected from ..." and "Simulate ..." in iPerlCommunication make a record in summary results, invoke OnTestCompleted(). 2015-08-26 18:00:46 +02:00
Milan Hanajik 3e86aa99cb Minimum and maximum value for the calculated calibration factor, version 1.5.101. 2015-08-26 17:57:49 +02:00
Milan Hanajik ebbc0528c6 "Q2 corrected from ..." fix, no correction when error <= 0.5% 2015-08-25 17:45:46 +02:00
Milan Hanajik 1d8156e4d7 Version 1.5.100: - serious bug in SensusOracle database configuration control fixed, etc.
- bug in ResultsWriter.Basic configuration control fixed
- FlyingStartMassCollection minor fixes
- iPerlCommunication activity "Q2 corrected from ..." implemented
- iPerl communication timeout increased to 1800 ms
- more comments in EntitiesTestResults
2015-08-25 17:03:36 +02:00
Milan Hanajik fcf4f6bdcf iPerlComm logging/display modifications: real PCB# shown, etc. Preparation for "Q2 corrected from ..." activity, version 1.5.99. 2015-08-25 11:47:21 +02:00
Milan Hanajik 08aed03cef Info message when at least one of the components is in Simulation mode, version 1.5.98. 2015-08-24 16:04:31 +02:00
Milan Hanajik da01b1fe61 CalibFactor included in 'summaryResults', version 1.5.97. 2015-08-24 15:16:14 +02:00
Milan Hanajik d4399c23ca DebugMode 'FailureDuringOperation' added. Redrawing results and reading iPerl opto-port more robust with extra exception handling, version 1.5.96. 2015-08-24 13:52:06 +02:00
Milan Hanajik 31fc49485a More DataEntry.iPerl changes, Oracle DB uses testResult.PurchaseOrder, opto-data logging creates ProcessData folder correctly. 2015-08-24 09:33:13 +02:00
Milan Hanajik 217ceffa67 DataEntry.iPerl forms added, version = 1.5.95. 2015-08-24 08:02:43 +02:00
Milan Hanajik 6b10e67c17 Fix in Q2 correction logging 2015-08-24 07:40:07 +02:00
Milan Hanajik 76b9f64029 Serious bugfixes - version 1.5.94 2015-08-22 20:37:43 +02:00
Milan Hanajik cabee1f06e Q2 correction finally solved, version 1.5.93. 2015-08-22 18:11:53 +02:00
Milan Hanajik 421474b990 Bugfixes: Q2 correction, both BenchID-s, ver.1.5.92 2015-08-22 16:25:35 +02:00
Milan Hanajik 6a7e1e5052 Start/Stop volume and time in logs for iPerl (datastream), ver.1.5.91. 2015-08-22 14:28:20 +02:00
Milan Hanajik f24cd89928 Bugfix in Q2 correction 2015-08-22 13:58:55 +02:00
Milan Hanajik 2b8f5ebec3 Bugfixes in: (1) use of iPerl Board# param, (2) Evaluate and Publish flying strt test params, (3) Q2 correction, (4) opto-log-file-name cleanup, etc. 2015-08-22 13:34:10 +02:00
Milan Hanajik f3dabcbcc1 Q2 correction 2015-08-22 07:55:17 +02:00
Milan Hanajik d390705df8 iPerlAdjustment removed from the project. 2015-08-22 06:27:57 +02:00
Milan Hanajik f75138eced FlyingStartCollectionMethod test parameters bool Evaluate and bool Publish added, ver.1.5.90. 2015-08-22 06:24:00 +02:00
Milan Hanajik 46b17fddc8 Many changes, iPerl-s have Board# param., iPerlCommunication has RFIT port nr. params, bugfixes, etc. 2015-08-21 20:52:10 +02:00
Milan Hanajik 5d00bcf456 Performance of reading opto-data improved, deferred logging, nr.threads in iPerlComm = 4version 1.5.89. 2015-08-21 16:09:36 +02:00
Milan Hanajik db8598579d Write given calibration factors function added, database almost implemented, version 1.5.88. 2015-08-21 14:30:47 +02:00
Milan Hanajik be1344034e SensusOracle.Database: TestBenchId added, working on queries. 2015-08-20 18:14:22 +02:00
Milan Hanajik a0c3ffd01a iPerlST: Use absolute value of volume difference in calculations. Comment added. 2015-08-20 18:12:43 +02:00
Milan Hanajik 4faf6b5d69 Fixed a problem with pumps P3 and P4 on iPerST bench, version 1.5.87. 2015-08-20 16:22:33 +02:00
Milan Hanajik 2e04076b30 Fixed a bug in iPerl decimal PCBNumber calculation, version 1.5.86 2015-08-20 05:13:20 +02:00
Milan Hanajik 20762b7fde iPerl decimal PCBNumber calculated from data in CaonfigStruct, TODO: fix a bug. 2015-08-20 05:06:23 +02:00
unknown 440199b3bc iPerlCommunication, etc: A correct calibration factor is written to iPerl. 2015-08-19 21:12:10 +02:00
Milan Hanajik 3647740d4a Oracle DB initialized and connection checked. 2015-08-19 17:45:29 +02:00
Milan Hanajik b8d9e1aa12 Manifest signing key problem fixed 2015-08-19 17:18:26 +02:00
Milan Hanajik 3ebeb4a0dc Sensus Oracle Database support (stub) added, version 1.5.85 2015-08-19 14:17:02 +02:00
Milan Hanajik 33963ec8cf Version 1.5.84. Reading registers, scales, temperature, pressure, ... during test done in one state in the sequence.
Many changes in TestMethods.iPerlCommunication and WaterMeters.iPerl.WaterMeter. iPerl measurement with opto-data works OK.
Logging in State changed, ...
2015-08-19 13:04:47 +02:00
Milan Hanajik fa6b99b980 StateMachine timing period is 2 seconds for iPerlST bench, 1 second for other all benches. 2015-08-19 13:00:00 +02:00
Milan Hanajik 22c652ad24 Bugfix: Reading of water meter pulses with overflow avoidance of 16-bit counters was not implemented correctly. 2015-08-19 12:56:28 +02:00
Milan Hanajik c376e67eab Watchdog function of QuidoRS device implemented permanently on output bit #4, mask 0x0010. 2015-08-19 12:53:34 +02:00
Milan Hanajik e349d6811d 'CommErr error' codes from RFID comm. routines instead of 'bool success'. 2015-08-17 16:02:30 +02:00
Milan Hanajik 7b134f7ba5 Version 1.5.82 2015-08-17 13:46:25 +02:00
Milan Hanajik 7f46e64a0d Version 1.5.81 2015-08-17 08:15:29 +02:00
Milan Hanajik ed4afff0b2 Changes: iPerl RR is reset at the beginnign of FlyingStartMassCollection test. etc. 2015-08-16 22:00:02 +02:00
Milan Hanajik 713fd9d0ae Raw opto telegram added, TODO: complete OptoTelegramRaw implementation. 2015-08-16 20:34:06 +02:00
Milan Hanajik 5db53ca6e3 Generic improvements: process page fixes, error format F2 or F3 (master), results page fixes, Comet ambient serial parameters (comment). 2015-08-16 19:58:43 +02:00
Milan Hanajik 752bfd98b1 iPerlST component updated, version 1.5.80 2015-08-16 18:07:04 +02:00
Milan Hanajik e302cb9335 OptoTelegram serial port data parsing, OptoData and RfidData logging, opto-measurement ready to be tested. 2015-08-16 12:54:44 +02:00
Milan Hanajik a6aa6739ad Modbus modification to support simulation mode. 2015-08-15 21:11:01 +02:00
Milan Hanajik ee044e3dd7 More iPerlCommunication changes: read/write Q2 correction factors from/to memory, cleanup of all functions. 2015-08-15 21:09:31 +02:00
Milan Hanajik 68a038d321 Version 1.5.79 2015-08-15 16:14:43 +02:00
Milan Hanajik a0cf76112d Version 1.5.78 2015-08-15 13:32:24 +02:00
Milan Hanajik 5f5ac87f42 iPerlCommunication: testModeConfig parsed and set, correct wm.Disabled behavior. 2015-08-14 20:18:44 +02:00
Milan Hanajik f85fbd0b55 Problems when passing flowmeter/diverter info to test start by SendCommand() fixed, version 1.5.77. 2015-08-14 18:14:08 +02:00
Milan Hanajik 90cfda893c ProcessTabPageCtrl48 functional for 40 watermeters. 2015-08-14 18:13:46 +02:00
Milan Hanajik 1bf987a6cd More iPerlST configuration changes (Entities, Mappings for 40 meters in MetersPath) 2015-08-14 14:37:53 +02:00
Milan Hanajik 4166bf8d87 More iPerl communication 2015-08-14 14:33:36 +02:00
Milan Hanajik bf376b4ff0 iPerlST configuration changes, etc., version 1.5.76 2015-08-14 12:01:00 +02:00
Milan Hanajik 7e28381df5 Working on iPerlCommunication activities required for the production cycle. 2015-08-14 11:39:28 +02:00
Milan Hanajik 289e06ce65 Added new components are unlocked - preparation, tests. 2015-08-13 08:36:28 +02:00
Milan Hanajik faeb940134 Communication with 40 iPerl meters in 1 worker thread. 2015-08-13 08:35:34 +02:00
Milan Hanajik 343c04061e Component updated. 2015-08-12 16:23:15 +02:00
Milan Hanajik 6440a8950c Communication in 4 parallel threads (4 boards, 4 RFID ports). 2015-08-12 16:05:06 +02:00
Milan Hanajik e569a80ec2 iPerl component updated + interface change: ulong DigitalInputs (it was uint), iPerlCommunication test method added, etc, version 1.5.75. 2015-08-12 14:55:35 +02:00
Milan Hanajik 40a43e46b4 Changes required for 'Zapiska'. 2015-08-02 17:23:47 +02:00
Milan Hanajik 7c1b713780 Zapiska and WaterMeterPL added, BenchInfo.Polska added, IBenchInfo infroduced, Version 1.5.74 2015-08-02 14:09:24 +02:00
Milan Hanajik 52c5679c00 iPerl test - iPerlAdjustment test method. 2015-08-01 21:24:32 +02:00
Milan Hanajik 5997a494bd OptoreeceivedEventArgs added to WaterMeters.iPerl 2015-07-31 19:45:10 +02:00
Milan Hanajik 3665f4d5d0 Dummy files deleted 2015-07-31 19:27:20 +02:00
Milan Hanajik f2da177517 Modbus and QuidoRS components added
WaterMeters folder created, WaterMeter component relocated within the project, iPerl component added
WaterMeters.iPerl implements IRegisterReader interface, TODO: Implement WaterMeter.ReadPulses( ) function
iPerlAdjustment test method added
2015-07-31 19:18:56 +02:00
Milan Hanajik 6ecae88518 iPerl ST support via define IPERLST, component added 2015-07-29 17:48:09 +02:00
Milan Hanajik 769bb5a9bc UiBridge simplified. 2015-07-29 16:42:59 +02:00
Milan Hanajik 083cfd0efd Version 1.5.72 2015-07-29 13:21:02 +02:00
Milan Hanajik 064de08d4b Version 1.5.71 2015-07-28 21:46:15 +02:00
Milan Hanajik f924e72088 Version 1.5.70 2015-07-27 10:54:26 +02:00
Milan Hanajik 81e6feded3 Version 1.5.69 2015-07-16 08:38:36 +02:00
Milan Hanajik a85af2bec8 ProcessTabPageCtrl24 items visibility for compound meters corrected. 2015-07-09 17:49:22 +02:00
Milan Hanajik 95c05078de Introduction of Program.CompoundWMsCount, fix in DataEntry.Combined.CycleBeginningForm, version 1.5.68. 2015-07-09 16:24:55 +02:00
Milan Hanajik 563141fbbe ProcessTabPageCtrl24 modificatons for compound meter. Version 1.5.67. 2015-07-06 15:40:57 +02:00
Milan Hanajik cca505fc2c Last minute changes 2015-07-03 16:52:36 +02:00
Milan Hanajik dd2e117f32 Pridane Polske preklady (Strings.pl). Version 1.5.66. 2015-07-03 15:40:46 +02:00
Milan Hanajik d323a4983e Process24 screen layout changed, controls for 24 water meters and related code added. 2015-07-03 12:26:34 +02:00
Milan Hanajik 212d675514 Problem with virtual valves fixed. They were lost when a test was started/stopped, RRoute was used. Version 1.5.65. 2015-07-03 10:53:48 +02:00
Milan Hanajik 58f872c6f4 Bug fix in adjustment dialog for 24 watermeters, version 1.5.64. 2015-07-03 02:42:30 +02:00
Milan Hanajik 46272b2d77 Version 1.5.63 2015-07-02 17:33:09 +02:00
Milan Hanajik c981707d91 private variable name fixed 2015-07-02 17:30:40 +02:00
Milan Hanajik 5292088622 A new form for 24 water meters in adjustment dialog 2015-07-02 17:28:11 +02:00
Milan Hanajik 7b52921730 ValveEx bug fixes. 2015-07-01 16:44:52 +02:00
Milan Hanajik c6bef8c699 Handler name corrected (style change) 2015-07-01 16:31:57 +02:00
Milan Hanajik c957e28c00 ValveEx bug fix 2015-07-01 16:31:32 +02:00
Milan Hanajik 55f42bb6cb ValveEx related change 2015-07-01 15:50:31 +02:00
Milan Hanajik 46118e91e5 ValveEx related change 2015-07-01 15:28:28 +02:00
Milan Hanajik a9f9769824 ProcessTabPageCtrl24 2015-06-30 03:32:17 +02:00
Milan Hanajik 234c76367e ProcessTabPageCtrl renamed to ProcessTabPageCtrl6. ProcessTabPageCtrl24 added to proejct. 2015-06-30 02:07:20 +02:00
Milan Hanajik e13b43586d ValveEx component added. 2015-06-30 02:06:58 +02:00
Milan Hanajik 7b902e8ca3 IComponentFactory.DummyComponent() interface function added and implemented in all components. 2015-06-29 11:14:33 +02:00
Milan Hanajik 9c99799694 Control board component supports virtual valves masking (to be used in Torun, Fuzhou300) 2015-06-27 07:51:54 +02:00
Milan Hanajik 10694609b3 Torun simulation corrected, ValveBase cleanup, version 1.5.61. 2015-06-27 07:05:28 +02:00
Milan Hanajik 0cea24246c Error message due to incorrect configuration is cleared after selecting another procedure/test.
Return value from WaitBeginFormClosed(..) changed from bool to enum UIFlowControl.
2015-06-25 04:48:28 +02:00
Milan Hanajik 01118ae924 Missing comment added 2015-06-25 04:48:27 +02:00
Milan Hanajik 245e338452 Modification to load the 'Process screen' on program start-up. 2015-06-25 04:48:25 +02:00
Milan Hanajik 02c235d164 Bug fixes in DataEntry/Standard24/CycleBeginningForm : crash in case LocalSettings.LastSNTexts were not initalized, ver. 1.5.60. 2015-06-25 04:48:24 +02:00
Milan Hanajik 38c4073632 Working on simulations for: Badger_Mala_Trat, Cevak_PT40_272, Torino50 and Torun_PT05_2015
- builds OK, flow and mass are simulated, reference counter does not count.
2015-06-25 04:47:59 +02:00
Milan Hanajik ca78f36f8f Default names when creating new components shortened. 2015-06-22 14:24:06 +02:00
Milan Hanajik 7fe7fafe1f Version 1.5.59 2015-06-22 13:13:27 +02:00
Milan Hanajik c3e4d1b317 Water meter pulses overflow is handled properly (only 16-bit HW counter is used) 2015-06-22 13:11:53 +02:00
Milan Hanajik 150777dafc CEVAK component added, common code for CEVAK added, version 1.5.58. 2015-06-18 13:14:56 +02:00
Milan Hanajik 4fc9bab96b More DataEntry.Combined changes: bool ShowCycleEndForm, no Units for volume, etc. 2015-06-12 21:37:48 +02:00
Milan Hanajik 06d55b287d More DataEntry.Combined.CycleBaginningForm: combo boxes used, key-press processed, etc. 2015-06-12 20:50:06 +02:00
Milan Hanajik 2b72e855f1 Diverter calibration wurks OK, TODO: Display transition, param.ref.flowm.
Version 1.5.57.
2015-06-12 19:52:29 +02:00
Milan Hanajik 2d64f91c9a Diverter test from Components -> Edit ... More 2015-06-12 19:34:41 +02:00
Milan Hanajik 79d819a501 Config change handler for Diverter, it should be possible to calibrate the analog input. 2015-06-12 16:39:57 +02:00
Milan Hanajik bfc7d5b438 Cosmetical changes,comments added into code in DataEntry.Standard24 2015-06-12 13:14:24 +02:00
Milan Hanajik 376367d0b2 DataEntry.Combined.TestStartEndForm (for fixed start method) added. 2015-06-12 13:13:27 +02:00
Milan Hanajik 8fff9e86c5 Bug fixes: LocalSettings.UpdateHistory, DataEntry.Standard.EntryForm 2015-06-10 18:33:43 +02:00
Milan Hanajik ea9a4a3953 Bug-fix in DataEntry.Standard form. Version 1.5.56. 2015-06-06 16:39:32 +02:00
Milan Hanajik c8afb2d87b Added: Fixed start method for combined meters. Version 1.5.55. 2015-06-02 18:04:20 +02:00
Milan Hanajik 1e0e3efd5a TimeFlow2Mass used in CombinedMeters flying start method. Code cleanup. 2015-06-02 17:58:42 +02:00
Milan Hanajik e2dfa05233 Bug-fix: Ambient.Comet.Ambient did not work in Simulation mode 2015-06-02 17:00:21 +02:00
Milan Hanajik b2fc829fa9 Component for Badger-mala-trat updated, version 1.5.54. 2015-05-27 22:40:40 +02:00
Milan Hanajik 7828de80fb DataEntry.Standard24: Layout... more changes. 2015-05-26 16:54:33 +02:00
Milan Hanajik f7ed0e09f1 DataEntry.Standard24: Layout of TextBoxes corresponds to the layout of water meters., version 1.5.52. 2015-05-26 16:25:32 +02:00
Milan Hanajik d7363c773f MOre bug-fixes in DataEntry.Standard24, version 1.5.51. 2015-05-26 14:34:56 +02:00
Milan Hanajik 7831e510d8 More bug-fixes in DataEntry.Standard24, version 1.5.50. 2015-05-26 14:12:37 +02:00
Milan Hanajik 09254b7065 More bug fixes (?), version 1.5.49 2015-05-26 13:47:08 +02:00
Milan Hanajik 4910f384ba Bug-fix in DataEntry.Standard24.TestStartEndForm, version 1.5.48 2015-05-26 13:05:30 +02:00
Milan Hanajik 9be43c9f0c Exception in DataEntry.Standard24.TestStartEndForm okButton_Pressed() logged, version 1.5.47 2015-05-26 12:41:06 +02:00
Milan Hanajik f35c7447d4 TODO updated 2015-05-23 15:46:25 +02:00
Milan Hanajik 4d81a40ddf DataEntry.Standard - code clean-up, <enter> key to moves focus between fields in CycleBeginningForm 2015-05-23 15:44:23 +02:00
Milan Hanajik 8de40fbf41 Bug fixes in results display in case test parts are used for standard meters, version 1.5.46. 2015-05-23 15:30:31 +02:00
Milan Hanajik 04196fde2f 'Break' button added to the main window, replaces 'Try heads' button. 2015-05-22 16:43:17 +02:00
Milan Hanajik cbda254731 Test/Part functionality extended for standard meters, Program.LineSize introduced (=10 in Torun). Version 1.5.45 2015-05-22 16:18:25 +02:00
Milan Hanajik edf35edfba EndCondition in transition steps is checked. Transition steps are finished when tank is empty. 2015-05-22 12:31:10 +02:00
Milan Hanajik edb6d5e8b6 'EndCondiiton' and 'Communication' added to TransitionStep (transition sequence). TODO: EndConditions functionality, version 1.5.44 2015-05-22 11:21:56 +02:00
Milan Hanajik 49f6aaf670 Removed for privacy 2015-05-22 10:24:46 +02:00
Milan Hanajik ae3f3bb762 Elde.TempMeterInternal and Elde.PressureMeterInternal component added, version 1.4.43. 2015-05-21 18:17:28 +02:00
Milan Hanajik d2b76cc58d Various bug fixe, ValveMove to flow repeted 1x, version 1.4.42 2015-05-21 16:39:18 +02:00
Milan Hanajik e94b4f2655 Results: 'Nr. meters in a group' bug fixes. Version 1.4.41. 2015-05-21 16:04:38 +02:00
Milan Hanajik 8afd487e87 CycleBeginning form in DataEntry.Standard24 accepts <enter> and <+> keys. 2015-05-21 15:53:29 +02:00
Milan Hanajik 8d7797f6fd More logging in MettlerToledo.Standard component - part 2 2015-05-21 14:31:42 +02:00
Milan Hanajik 6a80357c39 Torun component updated 2015-05-21 14:27:03 +02:00
Milan Hanajik 31dc55ac35 More logging in MettlerToledo.Standard component 2015-05-21 14:24:07 +02:00
Milan Hanajik a1668dc5dd CycleEndForm in DataEntry.Standard can be disabled as well. 2015-05-21 12:51:23 +02:00
Milan Hanajik 4cdf471c68 CycleEndForm in DataEntry.Standard24 can be disabled. 2015-05-21 12:50:41 +02:00
Milan Hanajik 0d1b1423c4 Results configuration with new parameter 'Nr. meters in a group'. Version 1.4.40 2015-05-21 12:13:15 +02:00
Milan Hanajik 3274b04983 Torun component updated 2015-05-21 10:53:52 +02:00
Milan Hanajik 07bd998291 DataEntry.Standard24 Test-Start-End data entry form completed, version 1.4.39 2015-05-21 10:53:28 +02:00
Milan Hanajik ca4a205fd4 DataEntry.Standard24.TestStartEndForm under construction. 2015-05-20 17:03:49 +02:00
Milan Hanajik 3701731de8 More logging of SendCalibData(...). Version 1.4.38. 2015-05-20 17:02:03 +02:00
Milan Hanajik ceb3de90bf Invalid configuration checked in StateMachine.GetPaths(...). More logging of mass display. 2015-05-20 16:18:54 +02:00
Milan Hanajik 18ee69f0db Torun bugfix: StatusP definition 2015-05-20 14:41:30 +02:00
Milan Hanajik bd56ccb570 DataEntry.Standard24 component added 2015-05-19 20:02:09 +02:00
Milan Hanajik 7fcc52412f Torun-PT50-2015 component updated, version 1.4.37. 2015-05-19 16:45:41 +02:00
Milan Hanajik cd9042a648 PulsesPerLiter added to Entities.MeterTestResult and to result items. Version 1.4.36
More times added to Entities.Test (TimeBeforeFlow, TimeFlow2Mass, TimeMass2Start, TimeStop2Mass).
Activity display fixed in FlyingStartCollectionMethod.
2015-05-19 15:38:58 +02:00
Milan Hanajik 6690ad65ca MettlerToledo/Multi balance problems solved, more logging. 2015-05-19 15:34:35 +02:00
Milan Hanajik 28c3aa21f3 Version 1.3.36 2015-05-15 18:41:53 +02:00
Milan Hanajik 52f4775ee2 BasicResultsWriter protocol extension 2015-05-15 18:40:22 +02:00
Milan Hanajik 387ef7ecb2 BasicResults protocol extensions: Configuration UI completed 2015-05-15 17:53:20 +02:00
Milan Hanajik abfec8960d Pump power in % shown on the process screen 2015-05-15 16:44:13 +02:00
Milan Hanajik 4ca1be21a9 Density in kg/m3, not in kg/l. 2015-05-15 15:46:26 +02:00
Milan Hanajik 791a5ea640 One more bug fix in ref. flow display in process tab page during measurement, ver. 1.3.35 2015-05-15 15:26:52 +02:00
Milan Hanajik 047ad0402e Correction for real water density used in all methods, in Metrology UI. 2015-05-15 15:06:06 +02:00
Milan Hanajik 4f104560ea Bug fix in ref. flow display in process tab page 2015-05-15 15:01:06 +02:00
Milan Hanajik 95e3eea080 Version 1.3.34 2015-05-14 22:36:06 +02:00
Milan Hanajik 44cae54788 MettlerToledo.Multi RunDeviceBefore() fixed, ver. 1.3.32. 2015-05-11 23:08:27 +02:00
Milan Hanajik e45be1243d MettlerToledo.Multi TaringOp disabled, ver. 1.3.31 2015-05-11 10:36:37 +02:00
Milan Hanajik 52fedb1e53 MettlerToledo.Multi: protocol debugged - works OK.. 2015-05-10 14:00:50 +02:00
Milan Hanajik 5f95737d56 MettlerToledo.Multi resolution added, Badger component updated 2015-05-07 21:19:43 +02:00
Milan Hanajik 9af74237cd Version 1.3.30 2015-05-07 20:09:25 +02:00
Milan Hanajik 843437a3b1 Completed MettlerToledo.Multi changes - ready for tests. 2015-05-07 20:07:53 +02:00
Milan Hanajik 247c8d7b49 MettlerToledo minor corrections, cleanup 2015-05-07 19:08:09 +02:00
Milan Hanajik 2fdd8be0a9 MettlerToledo.Multi copyright messages 2015-05-07 18:47:48 +02:00
Milan Hanajik 9ceea42656 MettlerToledo.Standard copyright messages 2015-05-07 18:47:29 +02:00
Milan Hanajik 5066c78c08 MettlerToledo.Multi cleanup 2015-05-07 18:45:02 +02:00
Milan Hanajik ab112e3e04 ReadMassesOp operation corrected. Works with both scales (Standard/Multi) 2015-05-07 18:31:46 +02:00
Milan Hanajik 85184e5eab Bug fix in TettlerToledo.Multi UI. 2015-05-07 18:14:31 +02:00
Milan Hanajik 8f3f3b0bea Cosmetical fix in MettlerToledo.Standard 2015-05-07 18:03:52 +02:00
Milan Hanajik d45da29ef7 MettlerToledo.Multi added to the project 2015-05-07 18:03:41 +02:00
Milan Hanajik 21d0adb089 MettlerToledo scales moved one level down in the directory and namespace structure. 2015-05-07 16:11:07 +02:00
Milan Hanajik 724537bd93 Version 1.3.29 2015-05-07 16:01:31 +02:00
Milan Hanajik 09f89e050a Component updated, version 1.3.28 2015-05-07 15:29:32 +02:00
Milan Hanajik b54f71b3e6 Version 1.3.27 2015-05-05 17:25:33 +02:00
Milan Hanajik fb4005afb7 Modifications for Torun 2015-05-05 17:20:36 +02:00
Milan Hanajik 85c29f4eef Torun component added, version 1.3.26 2015-05-05 16:43:01 +02:00
Milan Hanajik c15aaaf64f Version 1.3.25 2015-05-04 08:15:02 +02:00
Milan Hanajik c01657ec30 Enter can be used to move between fields in DataEntry.Standard TestStartEndForm. 2015-04-29 20:42:58 +02:00
Milan Hanajik 49e58ee789 Error limits for the exclamation mark in EntryForm.Standard TestStartEndForm doubled. 2015-04-29 20:12:43 +02:00
Milan Hanajik f37cb57427 Bug fixes 2015-04-29 19:59:21 +02:00
Milan Hanajik e124f3f406 DataEntry.Standard: Exclamation mark displayed when entering the end-state and volume is out of limit. 2015-04-29 19:03:00 +02:00
Milan Hanajik eb7acef8ae DataEntry.Standard ... TestStartForm (start only) deleted. 2015-04-29 18:17:40 +02:00
Milan Hanajik 94f7298088 DataEntry.Standard TestStartEndForm bugfix. 2015-04-29 17:44:12 +02:00
Milan Hanajik aac432eb4e DataEntry.Standard form for TestStartEnd. 2015-04-29 17:17:13 +02:00
Milan Hanajik aeca225246 TODO list updated. 2015-04-29 15:35:16 +02:00
Milan Hanajik 305bbe9c6c TestStartForm and TestEndForm are two separate forms. DataEntry.Standard.TestEndForm shows start states. 2015-04-29 15:33:49 +02:00
Milan Hanajik 6a11980d69 After a cycle or a test stop serial numbers are not queried for the 2nd time. Version = 1.3.24 2015-04-29 13:53:36 +02:00
Milan Hanajik b7bc5659e6 Order added to DataEntry.Combined. TODO: Process checkboxes. s/n history. 2015-04-28 19:19:25 +02:00
Milan Hanajik d5102fafc7 Dialog size fix. Process tab page flow format fix (4 valid digits). TODO updated. 2015-04-28 19:18:03 +02:00
Milan Hanajik 8391f22f64 Fixed start method: Delay before the 2nd mass measurement and the diverter switchover, etc. 2015-04-28 19:16:54 +02:00
Milan Hanajik 64a7355e9a Support for units for volume in DataEntry.Combined 2015-04-28 16:39:59 +02:00
Milan Hanajik cea32b7a59 Volume can be entered either in m3 or in liters in the DataEntry.Standard. 2015-04-28 16:38:37 +02:00
Milan Hanajik 32a3282d5d Support for alternative culture info, in this way it can be guaranteed that ',' works always as a decimal point. 2015-04-28 16:17:36 +02:00
Milan Hanajik 39eb2cfd57 Entry form related improvements / bugfixes (Fixed start collection method related). 2015-04-28 15:27:47 +02:00
Milan Hanajik 221669283d Version 1.3.23 2015-04-28 12:21:57 +02:00
Milan Hanajik 7a7933274e Version 1.3.22 2015-04-23 01:10:14 +02:00
Milan Hanajik 6ac22ac4a3 Print only good results temporarily hidden. 2015-04-23 01:05:55 +02:00
Milan Hanajik ec865d3b7c Resource files for more languages added: cs, es, fr, it, pl, ru, zh-CN. 2015-04-23 01:00:37 +02:00
Milan Hanajik ac12c441fc Language selection uses full language names (not codes). 2015-04-23 00:58:29 +02:00
Milan Hanajik 86919a14f7 Determination of column width in PrintOrderDocument corrected. 2015-04-23 00:57:43 +02:00
Milan Hanajik 57378a9b0d Preparation for 'Print only good results', version = 1.3.21 2015-04-22 07:11:09 +02:00
Milan Hanajik c72f5652bd component for Fuzhou300 updated, version = 1.3.20 2015-04-22 06:12:11 +02:00
Milan Hanajik dcfdb00c19 DataEntry.Standard entry form remembers serial numbers. These can be loaded from a drop-down., version = 1.3.19 2015-04-21 22:16:48 +02:00
Milan Hanajik 7ff2a98ccf PrintOrder: Print only the last results, version = 1.3.18 2015-04-21 07:34:41 +02:00
Milan Hanajik d1987d968e Version 1.3.17 2015-04-21 06:00:53 +02:00
Milan Hanajik 7b6c23f3b2 Printing Purchase orders always in landscape OK. Version 1.3.16.
Printing at the end of cycle can be switched off - Supress printing parameter of ResultsPrinter.Basic component.
2015-04-19 16:49:43 +02:00
Milan Hanajik 502ba1ec6e Version 1.3.15 2015-04-19 13:10:32 +02:00
Milan Hanajik 1c81600ae1 Delay time from flow stable and 1st mass measurement added. Database change (Time2MassMsrmt into Test). 2015-04-19 13:07:49 +02:00
Milan Hanajik 74712a3384 Version 1.2.15 2015-04-18 20:16:29 +02:00
Milan Hanajik f73863f758 Fixing behavior when more FM pumps share the same bit in Fuzhou300. More logging. 2015-04-18 13:31:31 +02:00
Milan Hanajik 55c5722629 Component for Fuzhou300 updated, version = 1.2.14. 2015-04-18 09:21:23 +02:00
Milan Hanajik 2b2cc0f6f8 Diverter - preparation for calibration 2015-04-18 07:31:52 +02:00
Milan Hanajik 63b4004d85 Comet Ambient modbus protocol implemented. 2015-04-17 18:22:08 +02:00
Milan Hanajik 754bcd3dc6 Comet Ambient added, TODO: Implement the protocol. 2015-04-16 22:06:42 +02:00
Milan Hanajik cd18d6498a Torino 50 component updated (exception when creating a log directory). Version 1.2.13 2015-04-15 22:16:35 +02:00
Milan Hanajik 7f059d9c6f Program extended for BADGER_MALA_TRAT 2015-04-15 22:03:23 +02:00
Milan Hanajik f84f3f1f0e version 1.2.12 2015-04-15 20:35:37 +02:00
Milan Hanajik be78bb5ce0 Copyright message added to all cs-files 2015-04-15 20:32:56 +02:00
Milan Hanajik 854a2e90c1 Bux fixes: DataEntry.Standard form for fixed start method, modeless form closing. 2015-04-14 11:20:48 +02:00
Milan Hanajik 5822a073df Bug fix: Wrong component class name 2015-04-14 08:23:19 +02:00
Milan Hanajik 274ab79cb7 DataEntry.Standard supports IHasWMStatesForm interface. Fixed start method should work without register readers (test!). 2015-04-14 07:14:45 +02:00
Milan Hanajik 1698a923bf Bug fix in fixed start method error calculation 2015-04-13 21:23:53 +02:00
Milan Hanajik f33c8af02a Modifications to support more languages (cn, it, pl, cz). 2015-04-13 11:04:18 +02:00
Milan Hanajik 92c9c81dd6 version 1.2.11 2015-04-11 07:56:08 +02:00
Milan Hanajik b60661303e pw update 2015-04-10 13:20:54 +02:00
Milan Hanajik 110f8d5e29 Chinese language for the 'Order' protocol 2015-04-10 12:59:26 +02:00
Milan Hanajik 2133df002b PT200 Israel simulation corrected. 2015-03-31 09:16:54 +02:00
Milan Hanajik c6a92ae399 version 1.2.10 2015-03-31 05:05:32 +02:00
Milan Hanajik 1d6c923782 version 1.2.9 2015-03-31 04:37:11 +02:00
Milan Hanajik b46f1d0405 Printing landscape on a printer set to portrait (almost all printers) 2015-03-31 04:28:27 +02:00
Milan Hanajik 7914306c3a version 1.2.8 2015-03-27 09:19:01 +01:00
Milan Hanajik e222c8432d Tester added to Print Order dialog, used in printout. TODO: Chinese 2015-03-27 09:07:44 +01:00
Milan Hanajik 45100be397 Changes related to localization to Chinese. 2015-03-27 07:27:36 +01:00
Milan Hanajik f989868fdf version 1.2.7.4 2015-03-27 06:58:53 +01:00
Milan Hanajik bf9c9e8017 version 1.2.6.3 2015-03-27 06:29:16 +01:00
Milan Hanajik 7db683ba34 Order printing completed, supports multiple pages, supports standard water meter only. 2015-03-27 06:24:47 +01:00
Milan Hanajik 2168454d7d My pw change 2015-03-27 06:23:55 +01:00
Milan Hanajik 1c69e3e0b1 Cleanup in new forms - protocols deleted. 2015-03-26 17:19:54 +01:00
Milan Hanajik 8b77f4ce68 PrintOrderForm added, invoked from MainWnd menu, uses LocalSettings to store position, load history.
TODO: Complete printing
2015-03-26 17:19:27 +01:00
Milan Hanajik acd64bb427 Water meter numbers in results are their positions on the bench (as originally) 2015-03-26 08:14:58 +01:00
Milan Hanajik 545677dc7a version 1.2.5.2 2015-03-26 07:54:35 +01:00
Milan Hanajik 847862a554 Purchase order history in Local settings 2015-03-26 06:38:03 +01:00
Milan Hanajik 0323efe57c PurchaseOrder handling in database and entry forms. DB table TestResult changed.
IHasCycleBeginForm and IHasCycleEndForm changed, values now available directly from forms, not only from Watermeters.
2015-03-26 05:53:15 +01:00
Milan Hanajik c85b65c2e1 ver.1.2.4.1 2015-03-26 02:38:47 +01:00
Milan Hanajik 21edd0d628 Build incremented (file version as well) 2015-03-26 02:34:01 +01:00
Milan Hanajik ca0ee444c7 Build incremented 2015-03-25 15:52:16 +01:00
Milan Hanajik cd1b449585 Metler-Toledo bug fix: When the scale was overloaded, it stopped measuring. 2015-03-25 15:07:39 +01:00
Milan Hanajik 5075bd6068 Regul. valve calibration completed and tested 2015-03-25 13:52:51 +01:00
Milan Hanajik 6b897537d9 Version = 1.1.2 (version Israel = 1.0.1) 2015-03-25 10:24:57 +01:00
Milan Hanajik a26c90f217 Mass values are printed out using format specified by Balance component parameters 2015-03-25 10:01:37 +01:00
Milan Hanajik 4342e7a8b2 Bug fixes in Entry Forms 2015-03-25 07:56:55 +01:00
Milan Hanajik 3b1f0129ba Bug fixed in Disabled watermeters will not appear in results...
When there were no results yet and Results screen was opened -> crash
2015-03-25 07:54:49 +01:00
Milan Hanajik 4f0ec7eb68 Version number and build date displayed in the main window title and AboutDlg. 2015-03-25 07:53:52 +01:00
Milan Hanajik 1e63ded8e1 MetersKind.Standard in TBF/Entities/Enums.cs reverted to MetersKind.Single 2015-03-25 05:35:05 +01:00
Milan Hanajik 23d5e6d19d Disabled watermeters will not appear in results (screen, ResultsPrinters.Basic and ResultsWriters.Basic).
Updating Disabled (default = false) is provided by DataEntry.Standard when entering serial numbers.
2015-03-25 03:57:46 +01:00
Milan Hanajik 7dce565e4f MetersKind.Single in TBF/Entities/Enuns.cs renamed to MetersKind.Standard 2015-03-25 02:31:28 +01:00
Milan Hanajik f524186b70 More DataEntry.Standard related changes 2015-03-25 02:14:42 +01:00
Milan Hanajik dc9577eaa0 Test methods for standard watermeter use IWatermeter.Disabled flag to remove non-existing meter results 2015-03-24 10:11:20 +01:00
Milan Hanajik d1e9537610 DataEntry.Standard (with checkBoxes) and DataEntry.Combined entry forms added.
IWaterMeter.Disabled supported.
2015-03-24 10:09:47 +01:00
Milan Hanajik 2902f36332 Work in progress: Diverter calibration 2015-03-24 02:45:36 +01:00
Milan Hanajik 1c46002aaa Regulation valve calibration fixed (feedback from ADC) 2015-03-24 02:45:09 +01:00
Milan Hanajik 4dfa98ff89 EtCalib[] array size for Torino corrected, index checked when accessing the array. 2015-03-24 02:44:13 +01:00
Milan Hanajik 3c7b3ad0b8 Torino50 component updated: oprava okolo VL13. 2015-03-23 04:11:50 +01:00
Milan Hanajik b761cea5f2 Torino50 component updated 2015-03-10 19:16:20 +01:00
Milan Hanajik 6305c42f8b More program extensions to handle TORINO50 define. 2015-03-09 17:30:38 +01:00
Milan Hanajik 82d5e7df05 Fix 2015-03-09 16:32:39 +01:00
Milan Hanajik c2bccda07f Program extensions to handle TORINO50 define. 2015-03-09 15:47:59 +01:00
Milan Hanajik e772823572 Creating a database, a block of code commented out. 2015-03-09 15:26:44 +01:00
Milan Hanajik a387e8c70f Component for Torino PT50 added. 2015-03-08 15:17:47 +01:00
Milan Hanajik fb1ddad3b8 One more bug fix in modeless data entry forms. 2015-03-08 15:13:50 +01:00
Milan Hanajik 9e28856229 Bug fixes in modeless data entry forms. 2015-03-08 09:05:40 +01:00
Milan Hanajik c005a5cb26 Solves issue with an opened CycleBeginForm after abort and re-selection in Israel:
- CloseCycleBeginForm() -> WaitBeginFormClosed()
- CloseBeginForm() added to SequenceBase(forced dialog close)
- CloseModellFormHandler added to UiBridge.Bridge
2015-03-01 11:13:26 +01:00
Milan Hanajik fc30e160fc - Unhandled exception handler added - it creates a log message.
- config.backup.xml file created and used in case config.xml is corrupted
- LocalSettings.Assign() function avoided
- static LocalSettins LocalSettings.Load(string fname) returns a reference to settings
2015-03-01 06:26:51 +01:00
Milan Hanajik 9fa72109da Fixed bugs:
- when there is a configuration error in a test and Data entry form for s/n-s was not closed yet
- when showing results with a combination of different tests
2015-02-21 20:03:33 +01:00
Milan Hanajik 82a72670a6 Remaining time displayed for all tests 2015-02-21 20:03:33 +01:00
Milan Hanajik 08e53c090e PMaxTest and LeakTest improvements:
- result items P_xy_start and P_xy_end added
- DurationLeak test parameter for LeakTest method
- correct default parameters for Danfoss.VLT2800.Pump (FC protocol)
- bug fixes
2015-02-20 13:07:21 +01:00
Milan Hanajik 286bd13eb8 Fiirst version of ResultsBrowser added 2015-02-20 09:44:35 +01:00
Milan Hanajik 371b4a9fbb Build-in power users implemented 2015-02-20 03:58:14 +01:00
Milan Hanajik 6aa63e8277 Some german translations added 2015-02-19 15:55:38 +01:00
Milan Hanajik b07c7c5c9d PMaxTest and LeakTest methods implemented, added to the project
Order of two new test wizard dialog exchanged
Pressure Selection wizard dialog added
2015-02-19 15:54:55 +01:00
Milan Hanajik 93fd6a4f42 Support for FC protocol for Danfoss-VLT2800 and associated valve added - control part 2015-02-18 22:50:44 +01:00
Milan Hanajik abd636b137 Checksum calculation for telegrams added, Telegram class added 2015-02-18 18:05:32 +01:00
Milan Hanajik 5e4eec4d70 Support for FC protocol for Danfoss-VLT2800 added - UI Part 2015-02-18 16:19:37 +01:00
Milan Hanajik 1dbbe31eae Bug fix for the case of combined WM test and odd total nr. of watermeters (Munich) 2015-02-18 14:49:19 +01:00
Milan Hanajik fbdd937302 Munich component updated 2015-02-18 13:12:12 +01:00
Milan Hanajik 2ca36374e6 Danfoss-VLT2800-Pump functions OK, TODO: control the valve of the pump 2015-02-16 21:01:37 +01:00
Milan Hanajik 50cd1c5d4f Files for Danfoss-VLT800-Pump added to the repository, builds OK 2015-02-16 13:36:22 +01:00
Milan Hanajik 6eb384283a Regul. valve calibration uses 2 sec. pulses 2015-02-10 09:01:30 +01:00
Milan Hanajik 1f590a71f5 Correct handling of up/down selection moves in TransitionStepsCtrl and VirtualBenchSteps
Exception not used during updates (when duration is invalid)
Minor resource change
2015-02-08 00:09:02 +01:00
Milan Hanajik 558cfb8c6e Bug fix in saving test results 2015-02-07 21:21:43 +01:00
Milan Hanajik 0b5d342dfc TODO list updated 2015-02-03 12:52:44 +01:00
Milan Hanajik 338a1f2d49 Cycle nr changed to Batch nr in printouts, saved data 2015-02-03 11:08:12 +01:00
Milan Hanajik 64253e1985 (1) RegulValveTandem wont appear in transition sequences, (2) Fixed RegulValveTandem initialization 2015-02-03 10:53:02 +01:00
Milan Hanajik 5806a65a0c RegulValveTandem op SetFlowOp should be functional, to be tested 2015-02-03 10:30:24 +01:00
Milan Hanajik ab8aa61a29 Initial version with config UI, w/o functionality, added to the project 2015-02-03 08:06:20 +01:00
Milan Hanajik 0c9408ff64 More configuration checks when starting a test 2015-02-02 23:18:28 +01:00
Milan Hanajik 94aa744fd4 Range of RegulValve indexes changed to 1..8, there are 6 RV-s in Pt200il 2015-02-02 22:49:08 +01:00
Milan Hanajik 9876297953 Printing of Qrise/Qfall results modified, '-' printed instead of '0' 2015-02-02 22:46:07 +01:00
Milan Hanajik d3a07bff44 Utils.FloatToStr(value, validDigits) modified, rounding taken into account 2015-02-02 22:44:34 +01:00
Milan Hanajik 9bd5fba6dc (1) CycleNr renamed to BatchNr (no DB change) and added to results/logs
(2) Safer result items
2015-02-02 18:10:52 +01:00
Milan Hanajik 3e48e4c50c Printed header correctly scaled, bugfix in saving results into DB/Summary 2015-02-02 15:04:48 +01:00
Milan Hanajik 3b66d4c4f7 Default valaues for Test and Procedure parameters in their constructors 2015-02-02 14:45:06 +01:00
Milan Hanajik e1756f692c Confirmed results to SummaryResults.txt logger 2015-02-02 11:38:42 +01:00
Milan Hanajik 376056fb1a Results to database consolidated, 1-based WMNr used in printing, saving 2015-02-02 10:35:15 +01:00
Milan Hanajik 56a9a7cf1b Test results are written into database after confirming with END 2015-02-02 00:08:47 +01:00
Milan Hanajik ce6214f631 Zapne pumpu pred vypustanim aj pri ostatnych metodach 2015-02-01 19:30:00 +01:00
Milan Hanajik 57a7510d05 Center stripe in the Error dialog of the Adjustment method 2015-02-01 19:28:26 +01:00
Milan Hanajik 7e8dfd472d Zapne pumpu pred vypustanim 2015-02-01 18:53:09 +01:00
Milan Hanajik 6dbff5978a Pokus 2015-02-01 17:14:50 +01:00
Milan Hanajik 806f4efe6a Results printing and saving uses Publish property of GenericDevices.ITestMethod 2015-02-01 16:20:27 +01:00
Milan Hanajik 0238a96975 More comments in SetFlowOp 2015-02-01 15:07:15 +01:00
Milan Hanajik ae5abde1e6 Results printing and saving improced, correct order of tests, etc. 2015-02-01 13:43:04 +01:00
Milan Hanajik 8009774c20 Bugfixes: FM pumps % interpretation after adding a pump, Tabs order in entry forms 2015-02-01 11:04:05 +01:00
Milan Hanajik efa14c6ebb Adjustment results will not be printed, shown, etc. 2015-02-01 08:20:13 +01:00
Milan Hanajik 0c4da37e85 Adjustment: Graphics added, to be tested 2015-01-28 22:14:30 +01:00
Milan Hanajik 5653628bf7 Adjust: Larger font, place for graphics 2015-01-28 20:57:03 +01:00
Milan Hanajik 94accbf58b Bugfix: Adjustment method modeless dialog was not started in UI thread, freezes 2015-01-28 19:33:02 +01:00
Milan Hanajik cca60e56ff Yet one more change - adjust 2015-01-28 19:03:00 +01:00
Milan Hanajik 508f47cb6b Adjustment test method ready for tests 2015-01-28 18:18:46 +01:00
Milan Hanajik 6a3e3e7682 Layout changes, c:/TBF/header.png used 2015-01-28 07:24:03 +01:00
Milan Hanajik 545cce6d11 Printed and Saved basic results output improved 2015-01-27 23:02:34 +01:00
Milan Hanajik 85bb34030a Bugfix in Fixed start method when configuration is NOK, no Dummy RR-s
Bugfix in FIxed start method Entry form when config.is NOK, WM-s are missing
2015-01-27 23:00:42 +01:00
Milan Hanajik 0b7c6a0fed First version of Basic printing (one page only) 2015-01-27 02:37:24 +01:00
Milan Hanajik c89549a0ae Pump power can be an arbitrary integer from 0 to 100, drop-down list changed 2015-01-26 16:03:11 +01:00
Milan Hanajik 8aa9ed9f21 Bugfix for PT200IL: Test does not complete, Status bits definition changed 2015-01-26 13:15:47 +01:00
Milan Hanajik c3f64215f1 ProtocolTitle added to 'Procedure' and 'TestResult'. ResultsWriter-Basic rewritten 2015-01-25 23:43:17 +01:00
Milan Hanajik 5cf5fe5eba CycleNr added to LocalSettings, Entities.TestResults, Mappings, is used in sequences (DB change) 2015-01-25 08:11:40 +01:00
Milan Hanajik dc57c1464b Component for PT200 Izrael updated after a visit to Fuzhou 2015-01-25 08:09:59 +01:00
Milan Hanajik 3393827653 Configuration of result items for device=harddisk added 2015-01-18 11:22:53 +01:00
Milan Hanajik ad665e5f0b Combined meters measurement corrections, Q_rise and Q_fall in results 2015-01-17 08:57:50 +01:00
Milan Hanajik cfd812eab6 Test-Part used when printing results on screen 2015-01-17 08:09:49 +01:00
Milan Hanajik bd1eb31f37 (1) ResultsConfig bug fixed, (2) UI for setting the Test parameter PumpPower, Parameters tab page 2015-01-17 06:34:24 +01:00
Milan Hanajik d3532a2796 PumpFM,pumpTandem test parameter Power replaced by parameter Entities.Test.PumpPower,
all changes done except of UI changes (which can be done in more different ways)
2015-01-17 04:52:42 +01:00
Milan Hanajik a0fb8000f0 PumpTandem can also be used as one of pumps in the tandem, PumpTandems can be chained 2015-01-16 07:40:04 +01:00
Milan Hanajik b1c9e0d3b5 Bugfixes: (1) PumpTandem was missing a Mask to be used as Valve, (2) Column widths in results screen 2015-01-16 07:08:26 +01:00
Milan Hanajik e07cf3c5d3 PumpTandem implemented for the case of two FM pumps with equal distribution of power 2015-01-16 05:24:34 +01:00
Milan Hanajik 6e75926d0b E_ref, T_amb, P_amb, H_amb were added to possible result items 2015-01-16 03:41:23 +01:00
Milan Hanajik 8b392016c2 Updated component for Fuzhou300: Corrected behavior of valves VM, etc 2015-01-16 03:18:49 +01:00
Milan Hanajik ade156be5c Column withs on the results screen can be saved and reused for all LIstView-s/watermeters 2015-01-16 03:09:41 +01:00
Milan Hanajik 2b6b569dee Process log format changes: flow with 4 valid digits, Et. -> Ref. 2015-01-16 03:09:39 +01:00
Milan Hanajik 5a2d7f09ce CycleBeginForm is opened earlier, immediately after procedure selection, before purging 2015-01-16 03:09:37 +01:00
Milan Hanajik bb31cdae56 Make sure CycleBeginForm is closed before the 1st test ends and s/n is in all results 2015-01-15 06:34:36 +01:00
Milan Hanajik 44b1f77b70 Process screen layout changed to fit 6 meter w/o overlaps, no functionality change 2015-01-15 05:45:40 +01:00
Milan Hanajik 11bdb1b2f1 Bugfix in MainSeq (opening EntryForm instead of closing) 2015-01-15 05:03:46 +01:00
Milan Hanajik 49a004d7fe DataEntry dlg at the beginning closes at the end of the 1st test (at the latest) 2015-01-15 03:51:33 +01:00
Milan Hanajik a697b7a4dc Access levels to procedures and tests changed: TestingSpecialist has access 2015-01-15 03:17:04 +01:00
Milan Hanajik 9c1db2778e Data of all combined meters are used in TestProgressEventArgs, in sequences and the process page 2015-01-15 03:16:14 +01:00
Milan Hanajik 1c3c90e171 CombinedMeters and CombinedWithDetection support SupressTrils bool parameter
Warnings 'Unreachable code' supressed in DataEntries
2015-01-14 05:33:51 +01:00
Milan Hanajik 5a4df5593a (1) Passed/Failed with color in the on-screen results
(2) Error of main and aux. combined watermeters calculated and can be used in results
(3) Bugfix: no zero reference exception when the list of results items is empty
2015-01-14 03:19:12 +01:00
Milan Hanajik 00b937553c Localization via strings table added to DataEntry.Munich3 (accepts 6 single WM-s) 2015-01-13 09:12:40 +01:00
Milan Hanajik 1f489a481c Entry form DataEntry.Munich modified so that it accepts up to 3 combined WM-s 2015-01-13 08:46:32 +01:00
Milan Hanajik 4ad79d54b0 Configuration of results: UI also for printer. Formatting float with given # of valid digits 2015-01-13 05:00:59 +01:00
Milan Hanajik f2b4bfe39d Configuration of results: Display on screen completed - to be tested 2015-01-12 17:18:34 +01:00
Milan Hanajik 42fbc501a9 Configuration of results: UI completed 2015-01-12 15:09:09 +01:00
Milan Hanajik 45eb5ac524 Bugfix in Clone method of the MeterTestResult entity 2015-01-12 12:59:30 +01:00
Milan Hanajik de7a04d689 Bug fix in UI: Process -> Metrology1 -> Emptying 2015-01-12 07:43:54 +01:00
Milan Hanajik aa1413bc83 More done on configuration of results: enum Source and two delegates 2015-01-12 07:12:01 +01:00
Milan Hanajik 34dc592e59 Timeout while setting the water flow handled correctly: message displayed, test aborted 2015-01-12 05:56:19 +01:00
Milan Hanajik 0829655880 Messages and Errors display is supported, transition messages are displayed now 2015-01-12 04:53:50 +01:00
Milan Hanajik 222887f97d Working on configuration of results form/printout, locking OK, ResultsItemSpec class added 2015-01-12 04:16:48 +01:00
Milan Hanajik 747eb87de9 Reconfigured for Munich 2015-01-11 09:34:32 +01:00
Milan Hanajik 766a3cb2b2 Column Message added to transition steps, DB format changed, not displayed during purging yet 2015-01-11 09:06:54 +01:00
Milan Hanajik d1cb0a4f43 Fixed problem: FM Pump is switched off when setting the flow, more logging 2015-01-11 08:24:05 +01:00
Milan Hanajik b79ae4b1aa PumpTandem component added (to be completed), fixes in component config edit controls 2015-01-11 05:06:18 +01:00
Milan Hanajik 5a0c01688a FIxed bug: Not all fields were copied when copying a procedure 2015-01-09 09:01:08 +01:00
Milan Hanajik 11f8343a1d Bug fix in purging sequence when no RV-s 2015-01-08 08:05:23 +01:00
Milan Hanajik b8fb6ba12c Fuzhou150 component updated, contains MakeExtComm() 2015-01-07 15:56:57 +01:00
Milan Hanajik a86ad864e1 Reconfigured for Fuzhou150, missing an upgraded component 2015-01-07 10:11:29 +01:00
Milan Hanajik 9fb462b087 Bug fix Null reference exception when starting a test 2015-01-07 10:11:29 +01:00
Milan Hanajik cd4e894652 Bug fix in UI / Components 2015-01-07 10:11:28 +01:00
Milan Hanajik 580d4330e3 - PidCoef from OutputPath used in flow control, PidCoef regulValve parameter abandoned
- Part field (int) added to Test and TestResult, shown and processed in UI in ProcedureDlg
2015-01-04 23:21:12 +01:00
Milan Hanajik 035416b785 Bug fix: Null reference exception when closing a modified procedure 2015-01-04 16:26:54 +01:00
Milan Hanajik de90a4638a Prepared: PID coefficient of the output path is ready to be used,
and not the regul.valve parameter. See  // TODO PID: ...  in source code.
 Database: 'PidCoef' float should be added to 'OutputPath' after col.'FlowMeter'
2015-01-03 21:17:11 +01:00
Milan Hanajik 0160dc965d - RegulValve ADC Open/Close values calibration implemented
- 'More' button added to ComponentCfgCtrl-s
- Dataflow from ComponentParametersDlg to components: CfgChangeHandler
- Dataflow from components to ComponentParametersDlg: CmdResponseHandler
- Detection of parameter changes and appropriate MesssageBox display:
  1.warning message when component configuration change requires program restart
  2.confirmation message box when any configuration changes would be lost
2015-01-03 14:45:58 +01:00
Milan Hanajik d9b1bc8b4a Bug fix: Null reference exception when opening a component properties dialog 2015-01-02 20:22:11 +01:00
Milan Hanajik f2005bbf56 Boilerplate code reduced from factories, GetComponent() and GetControl() added to cfg-s 2015-01-02 19:14:19 +01:00
Milan Hanajik 94de991bf6 Everything works OK after serious changes:
- all components, componentCfg-s and parameter providers use base classes
 - less boilerplate code, simpler access to test/procedure parameters from code
 - CreateTestParams(test), CreateProcedureParams(procedure) methods added
 - TestBenchSim class is made static, it is not inheritted by any device anymore
2015-01-02 12:51:27 +01:00
Milan Hanajik 752719bd62 Getting rid of and suppressing WARNING messages 2014-12-31 13:44:47 +01:00
Milan Hanajik 13f151b39a Support for PT200 Israel added, fixed component for Fuzhou300 (I4 problem) 2014-12-30 13:25:01 +01:00
Milan Hanajik 42c2f88597 Minor and style changes 2014-12-30 00:17:45 +01:00
Milan Hanajik 0ac7ba05d6 Methods CreateDbEntity and CreateFromDbEntity moved from XyzCfg to ComponentCfgBase, factories modified accordingly. 2014-12-29 18:33:27 +01:00
Milan Hanajik 8ef0cea1ff One more change in transition sequences with more RV-s changed in one step 2014-12-28 09:08:39 +01:00
Milan Hanajik 7472040cbc Last minute changes: German, ext-comm flag 2014-12-12 15:05:27 +01:00
Milan Hanajik 4794000f75 Fixed a bug in transition sequences with more RV-s changed in one step 2014-12-12 13:57:24 +01:00
Milan Hanajik 6d6b322fb5 Process screen and Procedure (dlg, DB) changes to suport combined meters, virtual bench.
TODO: Visualize changes of pump/valve, diverter, tank
2014-12-12 12:13:43 +01:00
Milan Hanajik 0808351b7a Change so that the component is used as on DN100 in horna skusobna 2014-12-11 12:56:50 +01:00
Milan Hanajik 89ae1bb52f Fixed bug: Wrong test selection when parts of the name match each other (e.g.Q1 and Q10) 2014-12-11 09:04:06 +01:00
Milan Hanajik 1afd6870c3 Time2MassMsrmt implemented, database tables Test and TestResult changed 2014-12-11 08:49:07 +01:00
Milan Hanajik ea6c9818cf - Tank emptying remaining time indication
- Bug fixed: When copying a procwdure ItemId was not correctly set, remained 0
- Always create a message log when device initialization is completed successfully
2014-12-10 22:39:53 +01:00
Milan Hanajik 42c255e40e More changes in VirtualBench drawing on the Process screen 2014-12-10 17:14:03 +01:00
Milan Hanajik 415adba8cf - Tank emptying on start-up implemented, EmptyTimeSec parameter added to Balances
- added events Event.TimerBusy, Event.ValvesBusy, etc.
- fixed bug in SetValvesOp
- preparing a virtual bench drawing on the Process screen - partly done
2014-12-10 12:37:05 +01:00
Milan Hanajik 6aada39d97 Reconfigured for 'Munich' installation 2014-12-07 22:32:41 +01:00
Milan Hanajik b1743662f4 Change that makes it possible to use IDC100 v.8.0.6d 2014-10-15 20:47:04 +02:00
Milan Hanajik 54595c9ebd ROI detection handled separately from (fatal) camera errors 2014-10-13 17:54:15 +02:00
Milan Hanajik 930db8c379 - many process tab page improvements
- program start and state changes logging improved
- IDC100 measurement related changes: reference pulses in RegisterReader
- etc
2014-10-02 20:56:24 +02:00
Milan Hanajik b6bbad66e7 IDC Camera related fixes - to be tested 2014-10-02 18:05:54 +02:00
Milan Hanajik deb6b90332 VirtualBenchSequences UI completed, delete step is not OK yet 2014-09-28 22:23:41 +02:00
Milan Hanajik 1c34946a6b Bugs in sequences fixed: Missing CheckUiOp 2014-09-26 17:48:55 +02:00
Milan Hanajik 26620f1fd1 First unfinished version with VirtualBenchSequences, requires DB upgrade 2014-09-26 15:01:46 +02:00
Milan Hanajik 9868c41640 Zmeny urobene v ST pri testovani kamery 2014-09-24 19:58:05 +02:00
Milan Hanajik 09affdb1dd Bug fixed in ControlComWrap logging: fmFreq.Length taken into account 2014-09-24 17:03:46 +02:00
Milan Hanajik fcea95d403 Process screen hides additional watermeters (if their number is < 6). 2014-09-24 15:38:54 +02:00
Milan Hanajik 5bfc348c72 Project reconfigured for DN100 (horna skusobna), no other changes 2014-09-24 12:41:18 +02:00
Milan Hanajik 2f6f24e281 As sent to ST for the last test on Fuzhou300 system
- new component with VZ15 and modified position of VZ13
- fixed start method evaluation OK
- handling of entry forms cleaned-up
2014-09-23 13:16:59 +02:00
Milan Hanajik c3bfe5223b - The update of the 6th watermeter data in ProcessTabPageCtrl fixed
- Valve/Pump delay evaluation modified: Delays of valves/pums that have not changed
  are not taken into account (faster when there is no valve/pump switching)
2014-09-17 19:17:05 +02:00
Milan Hanajik 15ab22362e - Number of watermeters increased to 6 for FUZHOU300
- DB table 'MetersPath' update required
2014-09-16 21:19:02 +02:00
Milan Hanajik b1f7730b96 - FixedStartMassCollection method ready to be tested
- FlyingStart method (without mass collection) flow corrections fixed
- DataEntry/WMStates data entry forms added (used by FixedStartMassCollection method)
- minor changes
2014-09-16 21:05:54 +02:00
Milan Hanajik 54ef1e1216 - added BenchControl/Operations/ProcessDataLoggingOp.cs (forgotten in previous commits)
- fixed a bug in displayng results and progress controls when two tests had the same name
- some work on data entry forms for FixedStartMassCollection method - not finished yet
2014-09-16 16:09:07 +02:00
Milan Hanajik a79be1e07a - bug fixed when component (class) in the DB does not exist in the code
- preparing FixedStartMassCollection sequence
2014-09-16 12:04:08 +02:00
Milan Hanajik c187dc9abf - FlyingStart with corrections
- FlowMeterCouple -> FlowMeterTwins
2014-09-15 22:00:37 +02:00
Milan Hanajik a919a3e9d6 - FLyngStart sequence (without balances) tested -> OK, Todo: use
corrections
- totalPulses calculated correctly in case of I11+I12 (use of two flowmeters)
2014-09-12 07:18:24 +02:00
Milan Hanajik 3559ab0ab3 - Elde.FlowMeterCouple component added
- LtrPerPulse and LtrPerPulseCorrected property/function added to IFlowMeter and flowmeters
2014-09-10 13:43:33 +02:00
Milan Hanajik fcfdfeca41 - COmponent properties 'Position' --> 'Idx0' or 'Idx1'
- process data logging, RegulVal position logging
- changes for I11+I12, NOK yet
2014-09-10 12:05:49 +02:00
Milan Hanajik c3050863a6 - Component update (temp., etc.)
- Process data logging update (SequenceBase.cs)
2014-09-09 18:29:01 +02:00
Milan Hanajik d0ebb62ab3 - Component update (temp.)
- Process data logging, first trial
2014-09-09 16:18:23 +02:00
Milan Hanajik 4db4c6e905 New component with Temperatures corrected, other minor/cosmetical changes 2014-09-09 13:06:10 +02:00
Milan Hanajik 354c13853f All PumpsWithFM are controlled when opening pumps at the test start 2014-09-09 09:14:47 +02:00
Milan Hanajik d14cb175a6 FlowStableSec parameter added to RegulValve 2014-09-08 20:24:46 +02:00
Milan Hanajik cc2a24cee5 - Fixed a bug in tank emptying
- Component
2014-09-08 17:13:51 +02:00
Milan Hanajik 4953290eb3 New component, commont bit of FM pumps handled correctly, etc 2014-09-08 15:45:43 +02:00
Milan Hanajik c0d81297f5 Balance empty mass is configurable 2014-09-08 15:39:33 +02:00
Milan Hanajik 9223483115 Early entered text checks in Transitions dialog 2014-09-08 14:48:48 +02:00
Milan Hanajik 6eee83042b PmpWithFM and Transition sequences functionality implemented 2014-09-08 13:16:31 +02:00
Milan Hanajik d98762aaf8 Transition sequences with PumpsFM[%] are OK in UI and in DB, not yet in the control code 2014-09-07 17:01:30 +02:00
Milan Hanajik 46861530a8 MainWnd size, location and maximized state saved. 2014-09-07 12:36:40 +02:00
Milan Hanajik 99377ce3b9 Size and location of some dialogs saved: Components, Paths, Transitions, Metrology, Procedures, Procedure 2014-09-07 09:34:28 +02:00
Milan Hanajik f9d2c43d57 - Tank empty threshold changed (increased)
- Fixed a bug in SequenceBase.LtrPerRefPulse[] initialization
2014-09-06 18:30:13 +02:00
Milan Hanajik b8faca784e - ReferenceFlowmeterCalibration method and sequence (ready for tests)
- FlyingStart method and sequence files prepared for implementation (copies of FlyingStartMassCollection)
2014-09-06 17:34:26 +02:00
Milan Hanajik fcd44e7a1a Process screen displays 5 watermeters 2014-09-06 14:57:05 +02:00
Milan Hanajik 36f2842b01 - Fixed a bug in valves inversion
- Changes in ProcessTabPageCtrl
2014-09-06 13:32:38 +02:00
Milan Hanajik a6f5b287c9 Fixed a bug in emptying valves initialization on StateMachine startup 2014-09-06 11:35:10 +02:00
Milan Hanajik ef8284586e SetValves operation uses Delay of 'Valve', 'Pump' and 'PumpWithFM' 2014-09-06 09:07:45 +02:00
Milan Hanajik 87f42ba291 Delay added to IValve and Pumps, no delay functionality yet 2014-09-06 08:10:08 +02:00
Milan Hanajik 6933442e76 - possibility to invert valves (UI as well as the functionality)
- UI prepared for the usage of valve delays
2014-09-06 07:37:27 +02:00
Milan Hanajik 74a6800f9e Changes done on Fuzhou300 system:
- ControlComDev.SetFMFreq() modifications (array size)
- StatusP and Route logging
- StatusP bit assignments: bit3 -> bit5
- MettlerToledo logging
2014-09-05 22:14:12 +02:00
Milan Hanajik 1d098f7893 - Modifications for 'StableTime' (ValveMove, RegulValve, etc.
- SHA1 checksum calculated and displayed in AboutDlg (sample data 'nejaky text')
- Modifications for the Fuzhou300 component
2014-09-05 14:17:12 +02:00
Milan Hanajik 51530bd088 - Component for Fuzhou300 added
- all components moved to appropriately named subdirectories
2014-09-05 11:15:32 +02:00
Milan Hanajik f01a0d84fe Folder with files for FixedStartMassCollection (copy of FlyingStart..) added to project, builds OK 2014-09-05 09:06:23 +02:00
Milan Hanajik 8ff05bcccf - StartValve added to OutputPath
- bug fixed in MeterTestResultMap: 'EndState' was not mapped into the database
2014-09-03 16:55:09 +02:00
Milan Hanajik 229564750f FLow meter position may be 0 (sum of two), flow meter range up to 1600 m3/h 2014-09-03 15:34:44 +02:00
Milan Hanajik b4a59518c0 Column widths in Paths dialog are stored in LocalSettings 2014-09-03 13:42:46 +02:00
Milan Hanajik 08468e60d6 - reconfigured to use Munich component and 5 watermeters
- valve categories used in paths, Category property added to IValve
2014-09-02 18:10:16 +02:00
Milan Hanajik c767512fad - Camera ROI DebugLevel inheritance fixed/improved, parent can be Off
- avoid empty lines in logs after SendCommand, SendCalibData, ValveMove logs
2014-08-15 20:50:42 +02:00
Milan Hanajik ea59dd0932 FlyingStart...Seq and CombinedMetersSeq sequences cleaned-up:
- Stop should work OK
- Target flow is tested and config error is shown in case it's NOK
- TestEnd sequence executed on Error
2014-08-15 14:32:03 +02:00
Milan Hanajik 596667a67e Default action and stopping the FM-controlled pump
moved to SequenceBase.Transition(sequence, context).
Sequences cleaned-up.
2014-08-14 09:06:01 +02:00
Milan Hanajik e128784bb8 Sequences cleaned-up 2014-08-13 16:20:00 +02:00
Milan Hanajik c56848958e - MessageBoxOp, MesssageBoxForm
- Configuration error handling in MainSeq
- Paths selection inside MainSeq
2014-08-12 22:21:26 +02:00
Milan Hanajik f4e7c7e88d Dnes koncim 2014-08-12 18:22:32 +02:00
Milan Hanajik 38a88e841b - Three tanks, balances, empty valves supported
- Code cleanup
2014-08-12 14:52:42 +02:00
Milan Hanajik d177a4f892 - Fixed bugs in (simultaneous) tank emptying 2014-08-11 21:19:47 +02:00
Milan Hanajik 7cdfad0738 - Bug fix in State.cs
- Component for DN100 being used
2014-08-11 18:33:30 +02:00
Milan Hanajik ffb4d5afb6 Koncim 8.8.14 2014-08-08 16:25:51 +02:00
Milan Hanajik ae09afef59 More changes - Modeless form for S/N entry ... 2014-08-08 15:22:24 +02:00
Milan Hanajik 5302aee2a1 Modeless form for S/N entry does not prevent test from starting 2014-08-08 12:45:15 +02:00
Milan Hanajik ea31fc31fe Fixed but in main sequence when there are no scales 2014-08-08 09:37:45 +02:00
Milan Hanajik a597da1e18 Waits 15sec after setting the initial flow before detection starts 2014-08-01 10:54:38 +02:00
Milan Hanajik fd2db3e229 As sent to Munich 2014-08-01 08:36:17 +02:00
Milan Hanajik 836daaa5a1 - German translations
- IBox, FloatBox, IntBox related changes
2014-07-31 22:17:48 +02:00
Milan Hanajik 66feec63de Koncim: IBox, etc. 2014-07-31 17:04:09 +02:00
Milan Hanajik 9a9a09f16d TolerRed parameter premenovany a pouzity ako Filter 2014-07-31 00:50:42 +02:00
Milan Hanajik 26b2c1f1a9 Simultaneous Tank-Empty op-s possible 2014-07-31 00:03:19 +02:00
Milan Hanajik 4bcffdc3a9 - Fixed bugs in DataEntry-Munich3 forms
- Troubleshooting camera detection
2014-07-29 19:25:13 +02:00
Milan Hanajik 8c83965315 ProcedureName added to TestResults entity, Basic writer changes 2014-07-29 15:06:29 +02:00
Milan Hanajik 019e85066f - Data from entry forms copied to test results as well
- Printed results layout change (subtitles in bold)
2014-07-29 08:42:19 +02:00
Milan Hanajik 7261d44728 Emergency stop form reactivated 2014-07-29 00:39:43 +02:00
Milan Hanajik 805e66d537 EndState added to MeterTestResult, UpdateTestResults added to EntryForms and IDataEntry 2014-07-28 23:12:43 +02:00
Milan Hanajik 16228800d4 Implemented an entry form for three single watermeters (for Munich) 2014-07-28 22:13:30 +02:00
Milan Hanajik a4b2c157a1 Upper limit for register reader position number removed. 2014-07-28 15:30:02 +02:00
Milan Hanajik f968ac8a3f The 1st protocol radio button pre-selected 2014-07-28 14:23:02 +02:00
Milan Hanajik 73d2a22f31 - German translations,
- Results writer file creation fixed.
2014-07-28 14:08:13 +02:00
Milan Hanajik aa3e19a76c Component updated and changed: DN100 --> MUNICH 2014-07-28 10:15:38 +02:00
Milan Hanajik efc6d22dad More files 2014-07-28 10:04:21 +02:00
Milan Hanajik 175a92f633 Initial commit almost identical to SVN-repo rev.340 2014-07-28 09:56:40 +02:00
1409 changed files with 381790 additions and 2913 deletions
+21 -7
View File
@@ -1,7 +1,21 @@
bin/
obj/
.vs/
*.suo
*.bak
*.pdb
Config/bin/
Config/obj/
DeviceTest/bin/
DeviceTest/obj/
Dirichlet.Numerics/bin
Dirichlet.Numerics/obj
Results/bin/
Results/obj/
ResultsBrowser/bin/
ResultsBrowser/obj/
TestBenchFramework/bin/
TestBenchFramework/obj/
TBFSetup/Debug/
TBFSetup/Release/
Users/bin/
Users/obj/
UserManagement/bin/
UserManagement/obj/
Doc/
*.suo
*.bak
+148
View File
@@ -0,0 +1,148 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{743DF7DB-C7B6-42EB-986D-0F485E5588E4}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Config</RootNamespace>
<AssemblyName>Config</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;MUNICH</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;MUNICH</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="FluentNHibernate">
<HintPath>..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll</HintPath>
</Reference>
<Reference Include="Iesi.Collections">
<HintPath>..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll</HintPath>
</Reference>
<Reference Include="log4net">
<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>
</Reference>
<Reference Include="NHibernate">
<HintPath>..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SQLite">
<HintPath>..\packages\System.Data.SQLite.1.0.90.0\lib\net40\System.Data.SQLite.dll</HintPath>
</Reference>
<Reference Include="System.Data.SQLite.Linq">
<HintPath>..\packages\System.Data.SQLite.1.0.90.0\lib\net40\System.Data.SQLite.Linq.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Data.cs" />
<Compile Include="DatabaseSettings.cs" />
<Compile Include="Entities\BenchPath.cs" />
<Compile Include="Entities\Component.cs" />
<Compile Include="Entities\ComponentProcedure.cs" />
<Compile Include="Entities\ComponentTest.cs" />
<Compile Include="Entities\Enums.cs" />
<Compile Include="Entities\FeedingPath.cs" />
<Compile Include="Entities\Group.cs" />
<Compile Include="Entities\HeatMetersPath.cs" />
<Compile Include="Entities\IHasItemNr.cs" />
<Compile Include="Entities\IHasValves.cs" />
<Compile Include="Entities\MeasurementCorrection.cs" />
<Compile Include="Entities\MetersPath.cs" />
<Compile Include="Entities\MeterTestResult.cs" />
<Compile Include="Entities\OutputPath.cs" />
<Compile Include="Entities\Procedure.cs" />
<Compile Include="Entities\ProcedureHistory.cs" />
<Compile Include="Entities\Test.cs" />
<Compile Include="Entities\TestResult.cs" />
<Compile Include="Entities\TransitionSequence.cs" />
<Compile Include="Entities\TransitionStep.cs" />
<Compile Include="Entities\User.cs" />
<Compile Include="Entities\VirtualBenchSequence.cs" />
<Compile Include="Entities\VirtualBenchStep.cs" />
<Compile Include="Entities\Watermeter.cs" />
<Compile Include="Entities\WMType.cs" />
<Compile Include="FluentCommon.cs" />
<Compile Include="Mappings\BenchPathMap.cs" />
<Compile Include="Mappings\ComponentMap.cs" />
<Compile Include="Mappings\ComponentProcedureMap.cs" />
<Compile Include="Mappings\ComponentTestMap.cs" />
<Compile Include="Mappings\FeedingPathMap.cs" />
<Compile Include="Mappings\GroupMap.cs" />
<Compile Include="Mappings\HeatMetersPathMap.cs" />
<Compile Include="Mappings\MeasurementCorrectionMap.cs" />
<Compile Include="Mappings\MetersPathMap.cs" />
<Compile Include="Mappings\MeterTestResultMap.cs" />
<Compile Include="Mappings\OutputPathMap.cs" />
<Compile Include="Mappings\ProcedureMap.cs" />
<Compile Include="Mappings\TestMap.cs" />
<Compile Include="Mappings\TestResultMap.cs" />
<Compile Include="Mappings\TransitionSequenceMap.cs" />
<Compile Include="Mappings\TransitionStepMap.cs" />
<Compile Include="Mappings\UserMap.cs" />
<Compile Include="Mappings\VirtualBenchSequenceMap.cs" />
<Compile Include="Mappings\VirtualBenchStepMap.cs" />
<Compile Include="Mappings\WatermeterMap.cs" />
<Compile Include="Mappings\WMTypeMap.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Resources\Strings.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Strings.resx</DependentUpon>
</Compile>
<Compile Include="Units.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\Strings.cs.resx" />
<EmbeddedResource Include="Resources\Strings.de.resx" />
<EmbeddedResource Include="Resources\Strings.pl.resx" />
<EmbeddedResource Include="Resources\Strings.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Strings.ru.resx" />
<EmbeddedResource Include="Resources\Strings.zh-CN.resx" />
</ItemGroup>
<ItemGroup>
<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.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
+78
View File
@@ -0,0 +1,78 @@
using System;
namespace Config
{
public class Data : Users.GlobalData
{
public const string AdminUsername = "admin";
public const string AdminPassword = "staratura";
public const string SQLiteDbFName = "SQLite.db";
#if MUNICH
public const int WMsCount = 3;
public const int LineSize = 1;
public const int CompoundWMsCount = 1;
public const int HeatMetersCount = 0;
public const int MaxPartNr = 3;
#elif DN100 || BADGER_VELKA_TRAT
public const int WMsCount = 3;
public const int LineSize = 3;
public const int CompoundWMsCount = 1;
public const int HeatMetersCount = 0;
public const int MaxPartNr = WMsCount / LineSize;
#elif FUZHOU300 || FUZHOU150 || PT200IL || PUCHONG_PT200 || GENESIS || BERLIN
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 TORINO50 || BADGER_MALA_TRAT
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 TORUN_PT50_2015 || CEVAK_PT40_272 || MURES_PT40 || FUZHOU_40
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
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 TURA_SPECIAL
public const int WMsCount = 6;
public const int LineSize = 6;
public const int CompoundWMsCount = 1;
public const int HeatMetersCount = 0;
public const int MaxPartNr = WMsCount / LineSize;
#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 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 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 = WMsCount / LineSize;
#endif
///
/// Database related: This object reference is set after a successful user login
///
public static DatabaseSettings CurrentBench;
}
}
+54
View File
@@ -0,0 +1,54 @@
///
/// Copyright (c) 2013-2017 Sensus Metering Systems
///
using System;
using System.Text;
using System.Xml.Serialization;
namespace Config
{
/// <summary>
/// Test bench database settings, contains bench name and settings od several databases
/// </summary>
public class DatabaseSettings : ICloneable
{
// Public fields
public string BenchName;
public bool IsRealBench;
public Users.DBSettings ProceduresDBSettings; /// Config database settings
public Users.DBSettings WaterMetersDBSettings; /// Results database settings
public Users.DBSettings UsersDBSettings; /// Users database settings
// Constructor
public DatabaseSettings()
{
BenchName = String.Empty; /// Empty string (avoid null)
IsRealBench = false;
ProceduresDBSettings = new Users.DBSettings(Users.Entities.DBType.MySql, string.Empty);
WaterMetersDBSettings = new Users.DBSettings(Users.Entities.DBType.MySql, string.Empty);
UsersDBSettings = new Users.DBSettings(Users.Entities.DBType.MySql, string.Empty);
}
public object Clone()
{
DatabaseSettings result = new DatabaseSettings();
result.BenchName = BenchName;
result.IsRealBench = IsRealBench;
result.ProceduresDBSettings = (Users.DBSettings)ProceduresDBSettings.Clone();
result.WaterMetersDBSettings = (Users.DBSettings)WaterMetersDBSettings.Clone();
result.UsersDBSettings = (Users.DBSettings)ProceduresDBSettings.Clone();
return result;
}
public override string ToString()
{
return string.Format("{0} config={1} results={2} users={3}",
BenchName,
ProceduresDBSettings.ConnectionString,
WaterMetersDBSettings.ConnectionString,
UsersDBSettings.ConnectionString);
}
}
}
+60
View File
@@ -0,0 +1,60 @@
///
/// Copyright (c) 2013-2016 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
namespace Config.Entities
{
public class BenchPath : IHasItemNr, IHasValves
{
public virtual int Id { get; protected set; }
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
public virtual float Qto { get; set; } /// Water flow in [m3/h]
public virtual string TempMtrUp { get; set; }
public virtual string TempMtrDown { get; set; }
public virtual string PressMtrUp { get; set; }
public virtual string PressMtrDown { get; set; }
public virtual string PressMtrDelta { get; set; }
public virtual string StopBFValve { get; set; }
/// Valves
public virtual string ValvesOpen { get; set; }
public virtual string ValvesClose { get; set; }
/// ------------- Additional stuff not mapped into the database -------------
public BenchPath()
{
ValvesOpen = string.Empty;
ValvesClose = string.Empty;
}
public BenchPath(string name, int itemNr)
: this()
{
Name = name;
ItemNr = itemNr;
}
public virtual BenchPath Clone(string name, int itemNr)
{
BenchPath result = new BenchPath(name, itemNr);
result.Qfrom = Qfrom;
result.Qto = Qto;
result.TempMtrUp = TempMtrUp;
result.TempMtrDown = TempMtrDown;
result.PressMtrUp = PressMtrUp;
result.PressMtrDown = PressMtrDown;
result.PressMtrDelta = PressMtrDelta;
result.StopBFValve = StopBFValve;
result.ValvesOpen = ValvesOpen;
result.ValvesClose = ValvesClose;
return result;
}
}
}
+74
View File
@@ -0,0 +1,74 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
namespace Config.Entities
{
public class Component : IHasItemNr
{
public virtual int Id { get; protected set; }
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
public virtual string ClassName { 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; }
/// ------------- Additional stuff not mapped into the database -------------
public Component()
{
Corrections = new List<MeasurementCorrection>();
}
public static Component CreateFromCfg(string name, string className, string parentName, int itemNr,
DebugMode debugLevel, LogLevel logLevel, string parameters)
{
Component result = new Component();
result.ItemNr = itemNr;
result.Name = name;
result.ClassName = className;
result.ParentName = parentName;
result.Mode = debugLevel;
result.Logging = logLevel;
result.Parameters = parameters;
return result;
}
// Makes a new copy of this object (not just a reference)
public virtual Component Clone()
{
Component result = new Component();
result.ItemNr = ItemNr;
result.Name = Name;
result.ClassName = ClassName;
result.ParentName = ParentName;
result.Mode = Mode;
result.Logging = Logging;
result.Parameters = Parameters;
return result;
}
public virtual string ToString(string indent)
{
string result = string.Empty;
result += indent + "ItemNr = " + (ItemNr + 1).ToString() + Environment.NewLine;
result += indent + "Name = " + Name + Environment.NewLine;
result += indent + "ClassName = " + ClassName + Environment.NewLine;
if (ParentName != null)
{
result += indent + "ParentName = " + ParentName + Environment.NewLine;
}
result += indent + "DebugLevel = " + Mode.ToString() + Environment.NewLine;
result += indent + "LogLevel = " + Logging.ToString() + Environment.NewLine;
result += indent + "Parameters = " + Parameters + Environment.NewLine;
return result;
}
}
}
+44
View File
@@ -0,0 +1,44 @@
///
/// Copyright (c) 2013-2017 Sensus Metering Systems
///
using System;
using System.IO;
namespace Config.Entities
{
public class ComponentProcedure
{
public virtual int Id { get; protected set; }
public virtual string CmpntName { get; set; } /// Component name
public virtual string Parameters { get; set; }
public virtual Procedure Procedure { get; set; }
public virtual ComponentProcedure Clone(Procedure newProcedure)
{
ComponentProcedure result = new ComponentProcedure();
result.CmpntName = CmpntName;
result.Parameters = Parameters;
result.Procedure = newProcedure;
return result;
}
public virtual void Export(StreamWriter output)
{
output.WriteLine(CmpntName);
output.WriteLine(Parameters.Replace(Environment.NewLine, "~"));
}
public static ComponentProcedure Import(StreamReader input, Procedure newProcedure)
{
string firstLine = input.ReadLine();
if (string.IsNullOrEmpty(firstLine)) return null;
ComponentProcedure result = new ComponentProcedure();
result.CmpntName = firstLine;
result.Parameters = input.ReadLine().Replace("~", Environment.NewLine);
result.Procedure = newProcedure;
return result;
}
}
}
+44
View File
@@ -0,0 +1,44 @@
///
/// Copyright (c) 2013-2017 Sensus Metering Systems
///
using System;
using System.IO;
namespace Config.Entities
{
public class ComponentTest
{
public virtual int Id { get; protected set; }
public virtual string CmpntName { get; set; } /// Component name
public virtual string Parameters { get; set; }
public virtual Test Test { get; set; }
public virtual ComponentTest Clone()
{
ComponentTest result = new ComponentTest();
result.CmpntName = CmpntName;
result.Parameters = Parameters;
result.Test = Test;
return result;
}
public virtual void Export(StreamWriter output)
{
output.WriteLine(CmpntName);
output.WriteLine(Parameters.Replace(Environment.NewLine, "~"));
}
public static ComponentTest Import(StreamReader input, Test newTest)
{
string firstLine = input.ReadLine();
if (string.IsNullOrEmpty(firstLine)) return null;
ComponentTest result = new ComponentTest();
result.CmpntName = firstLine;
result.Parameters = input.ReadLine().Replace("~", Environment.NewLine);
result.Test = newTest;
return result;
}
}
}
+357
View File
@@ -0,0 +1,357 @@
///
/// Copyright (c) 2013-2017 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using System.Reflection;
namespace Config.Entities
{
/// <summary>
/// Helper class to assign descriptions to enum values
/// </summary>
public class Description : Attribute
{
public string Text;
public Description(string t)
{
Text = t;
}
}
public static class GetDescription
{
/// Extension method for enum-s
public static string ToDescription(this Enum en)
{
Type type = en.GetType();
MemberInfo[] memInfo = type.GetMember(en.ToString());
if (memInfo != null && memInfo.Length > 0)
{
object[] attrs = memInfo[0].GetCustomAttributes(typeof(Description), false);
if (attrs != null && attrs.Length > 0)
return ((Description)attrs[0]).Text;
}
return en.ToString(); /// Return ToString() value in case there is no description
}
}
public enum ProcedureState
{
Active,
History,
Template,
Count,
}
/// <summary> Kind of meters for the procedure / test </summary>
public enum MetersKind
{
Single,
Combined,
HeatMeter,
}
public enum CompoundMeterId : byte
{
Single,
CompoundMain,
CompoundAux,
Compound,
HeatMeterVolume,
HeatMeterEnergy,
SingleOrCompound, /// Only used when querying results
}
public enum Medium
{
[Description("")] NotSpecified,
ColdWater,
HotWater,
Count
}
public enum Mounting
{
#if LANG_DE
[Description("")] NotSpecified,
[Description("H")] H, /// horizontal
[Description("V")] V, /// vertical
[Description("STR")] S, /// standrohre
[Description("F")] F, /// fall
#else
[Description("")] NotSpecified,
[Description("H")] H, /// horizontal
[Description("V")] V, /// vertical
[Description("S")] S, /// steig
[Description("F")] F, /// fall
#endif
Count
}
public enum TemperatureClass
{
[Description("")] NotSpecified,
[Description("T30")] T30,
[Description("T50")] T50,
[Description("T70")] T70,
[Description("T90")] T90,
[Description("T130")] T130,
[Description("T180")] T180,
[Description("T30/70")] T30_70,
[Description("T30/90")] T30_90,
[Description("T30/130")] T30_130,
[Description("T30/180")] T30_180,
[Description("30")] t30,
[Description("50")] t50,
[Description("70")] t70,
[Description("90")] t90,
[Description("130")] t130,
[Description("180")] t180,
Count
}
public enum FlowProfileSensitivityClass
{
[Description("")] NotSpecified,
[Description("U0")] U0, /// ?
[Description("D0")] D0, /// ?
Count
}
public enum PressureLossClass
{
[Description("")] NotSpecified,
[Description("dp63")] dp63, /// 0.063 MPa = 0.63 bar, TODO: Change to "Δp63"
[Description("dp40")] dp40, /// 0.040 MPa = 0.40 bar
[Description("dp25")] dp25, /// 0.025 MPa = 0.25 bar
[Description("dp16")] dp16, /// 0.016 MPa = 0.16 bar
[Description("dp10")] dp10, /// 0.010 MPa = 0.10 bar
Count
}
/// <summary> Maximum Admissible Pressure </summary>
public enum MaxAdmissiblePressure
{
[Description("")] NotSpecified,
[Description("MAP6")] MAP6,
[Description("MAP10")] MAP10,
[Description("MAP16")] MAP16,
[Description("MAP25")] MAP25,
[Description("MAP40")] MAP40,
Count
}
/// <summary> Transition step is finished when this condition is fulfilled </summary>
public enum StepCondition
{
None,
Scale1Empty,
Scale2Empty,
Scale3Empty,
AllScalesEmpty,
Count
}
public enum Publish : sbyte
{
#if LANG_DE
/// nemecky
[Description("nie")] Never = 0,
[Description("immer")] Always = 1,
[Description("Bildschirm")] OnScreen = 2,
[Description("intern")] Internal = 3,
#elif LANG_CS
/// cesky
[Description("nikdy")] Never = 0,
[Description("vždy")] Always = 1,
[Description("na obrazovku")] OnScreen = 2,
[Description("interně")] Internal = 3,
#elif LANG_SK
/// slovensky
[Description("nikdy")] Never = 0,
[Description("vždy")] Always = 1,
[Description("na obrazovku")] OnScreen = 2,
[Description("interne")] Internal = 3,
#elif LANG_PL
/// polsky
[Description("nigdy")] Never = 0,
[Description("zawsze")] Always = 1,
[Description("na ekranie")] OnScreen = 2,
[Description("wewnętrznie")] Internal = 3,
#else
[Description("Never")] Never = 0,
[Description("Always")] Always = 1,
[Description("On screen")] OnScreen = 2,
[Description("Internal")] Internal = 3,
#endif
Count
}
public enum MassMethod : byte
{
#if LANG_DE
/// nemecky
[Description("Waage")] Scale,
[Description("Spanne")] Spread,
[Description("Standardabw.")] StdDev,
#elif LANG_CS
/// cesky
[Description("váhou")] Scale,
[Description("max.rozdíl")] Spread,
[Description("std.dev.")] StdDev,
#else
[Description("Scale")] Scale,
[Description("Spread")] Spread,
[Description("Std.dev.")] StdDev,
#endif
Count
}
public enum TestRedType
{
Fix,
/// etc.
Count,
}
public enum FQC1
{
FQC1,
FQP1,
Count,
}
public enum Progress
{
JustStarted,
TransitionBefore,
SwitchingFlowDetection,
FlowSetting,
Test,
TransitionAfter,
Completed,
Count,
}
public enum Device
{
Screen,
Printer,
Disk,
}
public enum PageOrientation
{
Portrait,
Landscape,
Count,
}
public enum ItemCategory
{
#if LANG_DE
[Description("Allgemein")] Other,
[Description("Prüfstanddaten")] BenchData,
[Description("Prüfstandergebnisse")] BenchResult,
[Description("Prüfpunktdaten")] TestData,
[Description("Prüfpunktergebnisse")] TestResult,
[Description("Wasserzelledaten")] MeterData,
[Description("Wasserzelleergebnisse")] MeterResult,
#else
[Description("Other")] Other,
[Description("Bench data")] BenchData,
[Description("Bench result")] BenchResult,
[Description("Test data")] TestData,
[Description("Test result")] TestResult,
[Description("Meter data")] MeterData,
[Description("Meter result")] MeterResult,
#endif
Count,
}
/// <summary> Possible modes of operation of components and devices. </summary>
public enum DebugMode
{
#if LANG_DE
[Description("Erkennen-aus")] DetectedOff = -2,
[Description("Erkennen-ein")] DetectedOn = -1,
[Description("Normal")] Normal = 0, /// Normal operation
[Description("Auto-erkennen")] AutoDetect, /// The component (device) will be auto-detected
[Description("Fehler")] FailureDuringOperation, /// Failure during operation -> disabled
[Description("Aus")] Off, /// The component is off
[Description("Aufzeichnen")] Record,
[Description("Reply")] Reply,
[Description("Simuliert")] Simulate, /// Test bench simulation, this mode does not require any hardware
[Description("Geerbt")] Inherit,
#else
[Description("Detected off")] DetectedOff = -2,
[Description("Detected on")] DetectedOn = -1,
[Description("Normal")] Normal = 0, /// Normal operation
[Description("Auto detect")] AutoDetect, /// The component (device) will be auto-detected
[Description("Run-time error")] FailureDuringOperation, /// Failure during operation -> disabled
[Description("Off")] Off, /// The component is off
[Description("Record")] Record,
[Description("Reply")] Reply,
[Description("Simulate")] Simulate, /// Test bench simulation, this mode does not require any hardware
[Description("Inherit")] Inherit,
#endif
Count,
}
public enum LogLevel
{
#if LANG_DE
[Description("Aus")] Off,
[Description("Schwerwiegend")] Fatal,
[Description("Fehler")] Error,
[Description("Warnung")] Warn,
[Description("Info")] Info,
[Description("Debug")] Debug,
[Description("Alles")] All,
#else
[Description("Off")] Off,
[Description("Fatal")] Fatal,
[Description("Error")] Error,
[Description("Warn")] Warn,
[Description("Info")] Info,
[Description("Debug")] Debug,
[Description("All")] All,
#endif
Count,
}
/// <summary> Arrangement of tests </summary>
public enum TestsArrangement
{
Rows,
Columns,
}
/// <summary> Arrangement of meters </summary>
public enum MetersArrangement
{
Vertically,
Horizontally,
}
public enum Alignment
{
#if LANG_DE
[Description("links")] Left,
[Description("zentriert")] Center,
[Description("rechts")] Right,
[Description("angepasst")] Justified,
#else
[Description("Left")] Left,
[Description("Center")] Center,
[Description("Right")] Right,
[Description("Justified")] Justified,
#endif
Count
}
}
+52
View File
@@ -0,0 +1,52 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
namespace Config.Entities
{
public class FeedingPath : IHasItemNr, IHasValves
{
public virtual int Id { get; protected set; }
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
public virtual float Qto { get; set; } /// Water flow in [m3/h]
public virtual string Pump { get; set; }
public virtual string RegulValvesPct { get; set; } /// Positions of regulation valves in % separated by ';'
/// Valves
public virtual string ValvesOpen { get; set; }
public virtual string ValvesClose { get; set; }
/// ------------- Additional stuff not mapped into the database -------------
public FeedingPath()
{
ValvesOpen = string.Empty;
ValvesClose = string.Empty;
}
public FeedingPath(string name, int itemNr)
: this()
{
Name = name;
ItemNr = itemNr;
}
public virtual FeedingPath Clone(string name, int itemNr)
{
FeedingPath result = new FeedingPath(name, itemNr);
result.Qfrom = Qfrom;
result.Qto = Qto;
result.Pump = Pump;
result.RegulValvesPct = RegulValvesPct;
result.ValvesOpen = ValvesOpen;
result.ValvesClose = ValvesClose;
return result;
}
}
}
+14
View File
@@ -0,0 +1,14 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
namespace Config.Entities
{
public class Group
{
public virtual int Id { get; protected set; }
public virtual int Gid { get; set; }
public virtual string Name { get; set; }
}
}
+64
View File
@@ -0,0 +1,64 @@
///
/// Copyright (c) 2016 Sensus Metering Systems
///
using System;
namespace Config.Entities
{
public class HeatMetersPath : IHasItemNr
{
public virtual int Id { get; protected set; }
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
public virtual float TempWarmFrom { get; set; } /// Warm temperature range from [°C]
public virtual float TempWarmTo { get; set; } /// Warm temperature range to [°C]
public virtual float TempColdFrom { get; set; } /// Cold temperature range from [°C]
public virtual float TempColdTo { get; set; } /// Cold temperature renge to [°C]
public virtual string TMeterRefWarm1 { get; set; }
public virtual string TMeterRefWarm2 { get; set; }
public virtual string TMeterRefCold1 { get; set; }
public virtual string TMeterRefCold2 { get; set; }
public virtual string TMeterWorkWarm1 { get; set; }
public virtual string TMeterWorkWarm2 { get; set; }
public virtual string TMeterWorkCold1 { get; set; }
public virtual string TMeterWorkCold2 { get; set; }
/// ------------- Additional stuff not mapped into the database -------------
public HeatMetersPath()
{
}
public HeatMetersPath(string name, int itemNr)
: this()
{
Name = name;
ItemNr = itemNr;
}
public virtual HeatMetersPath Clone(string name, int itemNr)
{
HeatMetersPath result = new HeatMetersPath(name, itemNr);
result.TempWarmFrom = TempWarmFrom;
result.TempWarmTo = TempWarmTo;
result.TempColdFrom = TempColdFrom;
result.TempColdTo = TempColdTo;
result.TMeterRefWarm1 = TMeterRefWarm1;
result.TMeterRefWarm2 = TMeterRefWarm2;
result.TMeterRefCold1 = TMeterRefCold1;
result.TMeterRefCold2 = TMeterRefCold2;
result.TMeterWorkWarm1 = TMeterWorkWarm1;
result.TMeterWorkWarm2 = TMeterWorkWarm2;
result.TMeterWorkCold1 = TMeterWorkCold1;
result.TMeterWorkCold2 = TMeterWorkCold2;
return result;
}
}
}
+11
View File
@@ -0,0 +1,11 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
namespace Config.Entities
{
public interface IHasItemNr
{
int Id { get; }
int ItemNr { get; set; }
}
}
+11
View File
@@ -0,0 +1,11 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
namespace Config.Entities
{
public interface IHasValves
{
string ValvesOpen { get; set; } /// List of valves to be opened
string ValvesClose { get; set; } /// List of valves to be closed
}
}
+14
View File
@@ -0,0 +1,14 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
namespace Config.Entities
{
public class MeasurementCorrection
{
public virtual int Id { get; protected set; }
public virtual float Measurement { get; set; }
public virtual float Correction { get; set; }
}
}
+67
View File
@@ -0,0 +1,67 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
namespace Config.Entities
{
public class MeterTestResult
{
public virtual int Id { get; protected set; }
public virtual TestResult TestResult { get; set; } /// reference to the TestResult entity
public virtual bool Disabled { get; set; } /// true = this meter was disabled and the results should be disregarded
public virtual string SerialNr { get; set; }
public virtual string EndState { get; set; }
public virtual float VolumeStart { get; set; } /// liter
public virtual float VolumeEnd { get; set; } /// liter
public virtual float VolumeMeter { get; set; } /// liter
public virtual float VolumeRef { get; set; } /// liter
public virtual float VolumeErrorPct { get; set; } /// %
public virtual float PulsesMeter { get; set; } /// # of pulses
public virtual float PulsesPerLiter { get; set; } /// Pulses per liter
public virtual float PulsesMaster { get; set; }
public virtual float Time { get; set; } /// sec.
public virtual float TimeStart { get; set; } /// sec. - Not mapped to DB !!!
public virtual float TimeEnd { get; set; } /// sec. - Not mapped to DB !!!
public virtual int CalibFactor { get; set; } /// iPerl calibration factor used during the test - Not mapped to DB !!!
public virtual double Q2Correction { get; set; } /// iPerl Q2 correction used during the test - Not mapped to DB !!!
public virtual bool Passed { get; set; } /// true=test passed - Not mapped to DB !!!
public MeterTestResult()
{
PulsesPerLiter = 1.0f;
}
public MeterTestResult(TestResult testResult)
: this()
{
TestResult = testResult;
}
public virtual MeterTestResult Clone(TestResult testResult)
{
MeterTestResult result = new MeterTestResult(testResult);
result.Disabled = Disabled;
result.SerialNr = SerialNr;
result.EndState = EndState;
result.VolumeStart = VolumeStart;
result.VolumeEnd = VolumeEnd;
result.VolumeMeter = VolumeMeter;
result.VolumeRef = VolumeRef;
result.VolumeErrorPct = VolumeErrorPct;
result.PulsesMeter = PulsesMeter;
result.PulsesPerLiter = PulsesPerLiter;
result.PulsesMaster = PulsesMaster;
result.Time = Time;
result.TimeStart = TimeStart;
result.TimeEnd = TimeEnd;
result.CalibFactor = CalibFactor;
result.Q2Correction = Q2Correction;
result.Passed = Passed;
return result;
}
}
}
+208
View File
@@ -0,0 +1,208 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
namespace Config.Entities
{
public class MetersPath : IHasItemNr
{
public virtual int Id { get; protected set; }
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
/// 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 Sensor10 { get; set; }
public virtual string Sensor11 { get; set; }
public virtual string Sensor12 { get; set; }
public virtual string Sensor13 { get; set; }
public virtual string Sensor14 { get; set; }
public virtual string Sensor15 { get; set; }
public virtual string Sensor16 { get; set; }
public virtual string Sensor17 { get; set; }
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 -------------
public MetersPath()
{
}
public MetersPath(string name, int itemNr)
: this()
{
Name = name;
ItemNr = itemNr;
}
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.Sensor10 = Sensor10;
result.Sensor11 = Sensor11;
result.Sensor12 = Sensor12;
result.Sensor13 = Sensor13;
result.Sensor14 = Sensor14;
result.Sensor15 = Sensor15;
result.Sensor16 = Sensor16;
result.Sensor17 = Sensor17;
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 i)
{
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 i, string 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;
}
}
}
+65
View File
@@ -0,0 +1,65 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
namespace Config.Entities
{
public class OutputPath : IHasItemNr, IHasValves
{
public virtual int Id { get; protected set; }
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
public virtual float Qto { get; set; } /// Water flow in [m3/h]
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 TempDiv { get; set; }
public virtual string Scale { get; set; }
public virtual string EmptyTankValve { get; set; } /// Not used anywhere
/// Valves
public virtual string ValvesOpen { get; set; }
public virtual string ValvesClose { get; set; }
/// ------------- Additional stuff not mapped into the database -------------
public OutputPath()
{
ValvesOpen = string.Empty;
ValvesClose = string.Empty;
}
public OutputPath(string name, int itemNr)
: this()
{
Name = name;
ItemNr = itemNr;
}
public virtual OutputPath Clone(string name, int itemNr)
{
OutputPath result = new OutputPath(name, itemNr);
result.Name = Name;
result.Qfrom = Qfrom;
result.Qto = Qto;
result.RegulValve = RegulValve;
result.FlowMeter = FlowMeter;
result.PidCoef = PidCoef;
result.StartValve = StartValve;
result.Diverter = Diverter;
result.TempDiv = TempDiv;
result.Scale = Scale;
result.EmptyTankValve = EmptyTankValve;
result.ValvesOpen = ValvesOpen;
result.ValvesClose = ValvesClose;
return result;
}
}
}
+178
View File
@@ -0,0 +1,178 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
namespace Config.Entities
{
/// <summary>
/// Stores one test procedure, supports revisions and history log
/// </summary>
public class Procedure : IHasItemNr
{
public virtual int Id { get; protected set; }
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; } /// Short description
public virtual string CreationUser { get; set; } /// Name of the user who has created or changed this procedure
public virtual DateTime CreationTime { get; set; } /// Date and time of the creation or change
public virtual string LastChgUser { get; set; } /// Name of the user who has created or changed this procedure
public virtual DateTime LastChgTime { get; set; } /// Date and time of the creation or change
public virtual string LongDescription { get; set; } /// Long description (notes)
public virtual ProcedureState ProcedureState { get; set; }
public virtual int Revision { get; set; }
public virtual int PredecessorId { get; set; }
public virtual bool ObtainedByCopy { get; set; }
///
public virtual MetersKind MetersKind { get; set; }
public virtual string Watermeters { get; set; } /// Water meter name or Id
public virtual string ProtocolTitle { get; set; } /// Title of the printed and saved protocol
public virtual string DataEntry { get; set; } /// Component to use for data entry
public virtual string ResultsPrinter { get; set; } /// Component to use for printing the results
public virtual string ResultsWriter { get; set; } /// Component to use for saving the results into the file
public virtual string TransitionStart { get; set; }
public virtual string TransitionEnd { get; set; }
public virtual IList<ComponentProcedure> MoreParams { get; set; }
public virtual IList<Test> Tests { get; set; }
/// ------------- Additional stuff not mapped into the database -------------
public Procedure()
{
MoreParams = new List<ComponentProcedure>();
Tests = new List<Test>();
///
/// Default values
///
CreationUser = (Users.GlobalData.CurrentUser != null) ? Users.GlobalData.CurrentUser.UserName : null;
CreationTime = DateTime.Now;
LastChgUser = CreationUser;
LastChgTime = CreationTime;
MetersKind = Entities.MetersKind.Single;
ProtocolTitle = "Watermeter test protocol";
}
public Procedure(string name, int itemNr)
: this()
{
Name = name;
ItemNr = itemNr;
}
public virtual Procedure Clone()
{
Procedure result = new Procedure();
result.ItemNr = ItemNr;
result.Name = Name;
result.Description = Description;
result.CreationUser = CreationUser;
result.CreationTime = CreationTime;
result.LastChgUser = LastChgUser;
result.LastChgTime = LastChgTime;
result.LongDescription = LongDescription;
result.ProcedureState = ProcedureState;
result.Revision = Revision;
result.PredecessorId = Id;
result.ObtainedByCopy = ObtainedByCopy;
result.MetersKind = MetersKind;
result.Watermeters = Watermeters;
result.ProtocolTitle = ProtocolTitle;
result.DataEntry = DataEntry;
result.ResultsPrinter = ResultsPrinter;
result.ResultsWriter = ResultsWriter;
result.TransitionStart = TransitionStart;
result.TransitionEnd = TransitionEnd;
foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone(result)); }
foreach (var test in Tests) { result.Tests.Add(test.Clone()); }
return result;
}
public virtual void Export(StreamWriter output)
{
output.WriteLine(ItemNr.ToString(CultureInfo.InvariantCulture));
output.WriteLine(Name);
output.WriteLine(Description);
output.WriteLine(CreationUser);
output.WriteLine(CreationTime.ToString(CultureInfo.InvariantCulture));
output.WriteLine(LastChgUser);
output.WriteLine(LastChgTime.ToString(CultureInfo.InvariantCulture));
output.WriteLine(MetersKind.ToString());
output.WriteLine(Watermeters);
output.WriteLine(ProtocolTitle);
output.WriteLine(DataEntry);
output.WriteLine(ResultsPrinter);
output.WriteLine(ResultsWriter);
output.WriteLine(TransitionStart);
output.WriteLine(TransitionEnd);
foreach (var prms in MoreParams) { prms.Export(output); }
output.WriteLine();
foreach (var test in Tests) { test.Export(output); }
output.WriteLine();
output.Close();
}
public static Procedure Import(StreamReader input)
{
Procedure result = new Procedure();
result.ItemNr = int.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
result.Name = input.ReadLine();
result.Description = input.ReadLine();
result.CreationUser = input.ReadLine();
result.CreationTime = DateTime.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
result.LastChgUser = input.ReadLine();
result.LastChgTime = DateTime.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
string line = input.ReadLine();
result.MetersKind = line.Equals(MetersKind.Single.ToString()) ? MetersKind.Single : (line.Equals(MetersKind.Combined.ToString()) ? MetersKind.Combined : MetersKind.HeatMeter);
result.Watermeters = input.ReadLine();
result.ProtocolTitle = input.ReadLine();
result.DataEntry = input.ReadLine();
result.ResultsPrinter = input.ReadLine();
result.ResultsWriter = input.ReadLine();
result.TransitionStart = input.ReadLine();
result.TransitionEnd = input.ReadLine();
while(true)
{
ComponentProcedure prms = ComponentProcedure.Import(input, result);
if (prms == null)
break;
else
result.MoreParams.Add(prms);
}
while (true)
{
Test tst = Test.Import(input, result);
if (tst == null)
break;
else
result.Tests.Add(tst);
}
return result;
}
public override string ToString()
{
return string.Format("{0}, rev.{1}", Name, Revision);
}
}
}
+31
View File
@@ -0,0 +1,31 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
namespace Config.Entities
{
public class ProcedureHistory
{
public virtual int Id { get; protected set; }
public virtual Procedure Current { get; set; }
public virtual IList<Procedure> OldProcedures { get; set; }
/// ------------- Additional stuff not mapped into the database -------------
public ProcedureHistory()
{
Current = new Procedure();
OldProcedures = new List<Procedure>();
}
public virtual ProcedureHistory Clone()
{
ProcedureHistory result = new ProcedureHistory();
result.Current = Current.Clone();
foreach (Procedure p in OldProcedures) result.OldProcedures.Add(p.Clone());
return result;
}
}
}
+242
View File
@@ -0,0 +1,242 @@
///
/// Copyright (c) 2013-2017 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
namespace Config.Entities
{
/// <summary>
/// Test, consisting of one or more repetitions of the test 'SingleTest'.
/// </summary>
public class Test : IHasItemNr
{
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 sbyte Publish { get; set; } /// 0=no, 1=in all protocols, 2=on screen, 3=internal
public virtual bool Evaluate { get; set; }
public virtual float Qfrom { get; set; } /// Water flow low limit in [m3/h]
public virtual float Qto { get; set; } /// Water flow high limit in [m3/h]
public virtual float Volume { get; set; } /// Test volume (target) in [l]
public virtual float TstTime { get; set; } /// Test time (estimate) in [s]
public virtual string Method { get; set; }
public virtual float ErrLimLo { get; set; } /// in [%] (usually < 0)
public virtual float ErrLimHi { get; set; } /// in [%] (usually > 0)
public virtual float Uncertainty { get; set; } /// int [%] makes error limits tighter: 0 <= Uncertainty <= abs(ErrLimXx)
public virtual int Repeats { get; set; }
public virtual bool Draining { get; set; }
public virtual bool Zeroing { get; set; }
public virtual float PumpPower { get; set; } /// Power of the pump in [%] in the range 0 .. 100.0f, use values 0% and 100% for non-FM pumps
public virtual int MassRepeats { get; set; } /// Number of mass. measurements at the beginning/end of test, 0 = default (=5)
public virtual float MassSpread { get; set; } /// Max spread of mass. measurements at the beginning/end of test, 0 = default
public virtual MassMethod MassMethod { get; set; } /// method of mass. measurement at the beginning/end of test: false=slow (precise), true=using immediate mass measurement and evaluation
public virtual int TimeBeforeFlow { get; set; } /// Delay time before the start of flow control in [s]
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 double TolerRed { get; set; } /// = Filter
public virtual TestRedType RedType { get; set; }
public virtual string FeedingPath { get; set; }
public virtual string BenchPath { get; set; }
public virtual string OutputPath { get; set; }
public virtual string MetersPath { get; set; }
#if HEAT_METERS
public virtual string HeatMetersPath { get; set; }
#endif
public virtual string RelTransBefore { get; set; }
public virtual string RelTransBetween { get; set; }
public virtual string RelTransAfter { get; set; }
public virtual string TransitionAfter { get; set; }
public virtual IList<ComponentTest> MoreParams { get; set; }
public virtual Procedure Procedure { get; set; }
/// ------------- Additional stuff not mapped into the database -------------
public Test()
{
MoreParams = new List<ComponentTest>();
///
/// Default values
///
Publish = (sbyte)Config.Entities.Publish.Always;
Evaluate = true;
Repeats = 1;
Draining = false;
Zeroing = false;
ErrLimLo = -2.0f; /// [%] lower error limit
ErrLimHi = 2.0f; /// [%] upper error limit
Uncertainty = 0;
PumpPower = 60.0f; /// [%]
MassRepeats = 0; /// default
MassSpread = 0; /// default
MassMethod = MassMethod.Scale; /// default
TimeBeforeFlow = 10; /// [s] time before the start of flow control in [s]
TimeFlow2Mass = 5; /// [s] time from the flow stable to the 1st mass measurement in [s]
TimePump2StartV = 1; /// [s] time from the 1st mass measurement to the test start in [s]
TimeStop2Mass = 5; /// [s] between the test end and the final mass measurement
TolerRed = 0; /// = Filter parameter
RelTransBefore = string.Empty;
RelTransBetween = string.Empty;
RelTransAfter = string.Empty;
TransitionAfter = string.Empty;
}
public Test(string name, int itemNr, Procedure procedure)
: this()
{
Name = name;
ItemNr = itemNr;
Procedure = procedure;
}
// Makes a new copy of this object (not just a reference)
public virtual Test Clone()
{
Test result = new Test(Name, ItemNr, Procedure);
result.Part = Part;
result.Publish = Publish;
result.Evaluate = Evaluate;
result.Qfrom = Qfrom;
result.Qto = Qto;
result.Volume = Volume;
result.TstTime = TstTime;
result.Repeats = Repeats;
result.Draining = Draining;
result.Zeroing = Zeroing;
result.PumpPower = PumpPower;
result.MassRepeats = MassRepeats;
result.MassSpread = MassSpread;
result.MassMethod = MassMethod;
result.TimeBeforeFlow = TimeBeforeFlow;
result.TimeFlow2Mass = TimeFlow2Mass;
result.TimePump2StartV = TimePump2StartV;
result.TimeStop2Mass = TimeStop2Mass;
result.Method = Method;
result.ErrLimLo = ErrLimLo;
result.ErrLimHi = ErrLimHi;
result.Uncertainty = Uncertainty;
result.TolerRed = TolerRed;
result.RedType = RedType;
result.FeedingPath = FeedingPath;
result.BenchPath = BenchPath;
result.OutputPath = OutputPath;
result.MetersPath = MetersPath;
#if HEAT_METERS
result.HeatMetersPath = HeatMetersPath;
#endif
result.RelTransBefore = RelTransBefore;
result.RelTransBetween = RelTransBetween;
result.RelTransAfter = RelTransAfter;
result.TransitionAfter = TransitionAfter;
foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone()); }
return result;
}
public virtual void Export(StreamWriter output)
{
output.WriteLine(Name);
output.WriteLine(Part.ToString(CultureInfo.InvariantCulture));
output.WriteLine(Publish.ToString(CultureInfo.InvariantCulture));
output.WriteLine(Evaluate.ToString());
output.WriteLine(Qfrom.ToString(CultureInfo.InvariantCulture));
output.WriteLine(Qto.ToString(CultureInfo.InvariantCulture));
output.WriteLine(Volume.ToString(CultureInfo.InvariantCulture));
output.WriteLine(TstTime.ToString(CultureInfo.InvariantCulture));
output.WriteLine(Method);
output.WriteLine(ErrLimLo.ToString(CultureInfo.InvariantCulture));
output.WriteLine(ErrLimHi.ToString(CultureInfo.InvariantCulture));
output.WriteLine(Uncertainty.ToString(CultureInfo.InvariantCulture));
output.WriteLine(Repeats.ToString(CultureInfo.InvariantCulture));
output.WriteLine(Draining.ToString());
output.WriteLine(Zeroing.ToString());
output.WriteLine(PumpPower.ToString(CultureInfo.InvariantCulture));
output.WriteLine(MassRepeats.ToString(CultureInfo.InvariantCulture));
output.WriteLine(MassSpread.ToString(CultureInfo.InvariantCulture));
output.WriteLine(((byte)MassMethod).ToString(CultureInfo.InvariantCulture));
output.WriteLine(TimeBeforeFlow.ToString(CultureInfo.InvariantCulture));
output.WriteLine(TimeFlow2Mass.ToString(CultureInfo.InvariantCulture));
output.WriteLine(TimePump2StartV.ToString(CultureInfo.InvariantCulture));
output.WriteLine(TimeStop2Mass.ToString(CultureInfo.InvariantCulture));
output.WriteLine(FeedingPath);
output.WriteLine(BenchPath);
output.WriteLine(OutputPath);
output.WriteLine(MetersPath);
output.WriteLine(RelTransBefore);
output.WriteLine(RelTransBetween);
output.WriteLine(RelTransAfter);
output.WriteLine(TransitionAfter);
foreach (var prms in MoreParams) { prms.Export(output); }
output.WriteLine();
}
public static Test Import(StreamReader input, Procedure newProcedure)
{
string firstLine = input.ReadLine();
if (string.IsNullOrEmpty(firstLine)) return null;
Test tst = new Test();
tst.Name = firstLine;
tst.Part = int.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.Publish = sbyte.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.Evaluate = bool.Parse(input.ReadLine());
tst.Qfrom = float.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.Qto = float.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.Volume = float.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.TstTime = float.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.Method = input.ReadLine();
tst.ErrLimLo = float.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.ErrLimHi = float.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.Uncertainty = float.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.Repeats = int.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.Draining = bool.Parse(input.ReadLine());
tst.Zeroing = bool.Parse(input.ReadLine());
tst.PumpPower = float.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.MassRepeats = int.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.MassSpread = float.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.MassMethod = (MassMethod)byte.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.TimeBeforeFlow = int.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.TimeFlow2Mass = int.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.TimePump2StartV = int.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.TimeStop2Mass = int.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
tst.FeedingPath = input.ReadLine();
tst.BenchPath = input.ReadLine();
tst.OutputPath = input.ReadLine();
tst.MetersPath = input.ReadLine();
tst.RelTransBefore = input.ReadLine();
tst.RelTransBetween = input.ReadLine();
tst.RelTransAfter = input.ReadLine();
tst.TransitionAfter = input.ReadLine();
while (true)
{
ComponentTest prms = ComponentTest.Import(input, tst);
if (prms == null)
break;
else
tst.MoreParams.Add(prms);
}
tst.Procedure = newProcedure;
return tst;
}
public override string ToString()
{
string partStr = (Part > 0) ? string.Format(", part {0}", Part) : string.Empty;
return string.Format("{0}(P.{1},{2}){3}", Name, ((Publish)Publish).ToString(), Evaluate ? "E" : "-", partStr);
}
}
}
+176
View File
@@ -0,0 +1,176 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
namespace Config.Entities
{
public class TestResult
{
public virtual int Id { get; protected set; }
public virtual string Name { get; set; }
public virtual int BatchNr { get; set; }
public virtual string PurchaseOrder { get; set; }
public virtual MetersKind MetersKind { get; set; }
public virtual IList<MeterTestResult> Meters { get; set; }
public virtual IList<MeterTestResult> CombinedMeters { get; set; }
/// Value copied from the procedure (Entities.Procedure)
public virtual string ProcedureName { get; set; }
public virtual string ProtocolTitle { get; set; }
/// Values copied from the test (Entities.Test)
public virtual int TestId { get; set; } /// Test entity ID to distinguish between tests with the same name
public virtual string TestName { get; set; }
public virtual int Part { get; set; }
public virtual bool DoNotEvaluate { get; set; } /// Not mapped to the database
public virtual bool DoNotPublish { get; set; } /// Not mapped to the database
public virtual float Qfrom { get; set; } /// [m3/h] Water flow low limit
public virtual float Qto { get; set; } /// [m3/h] Water flow high limit
public virtual float Volume { get; set; } /// [l] Target test volume
public virtual float TstTime { get; set; } /// [s] Test time estimate
public virtual int Repeats { get; set; }
public virtual bool Emptying { get; set; }
public virtual bool Zeroing { get; set; }
public virtual float PumpPower { get; set; } /// Power of the pump in [%] in the range 0 .. 100.0f, use values 0% and 100% for non-FM pumps
public virtual int Time2MassMsrmt { get; set; }
public virtual string Method { get; set; }
public virtual float ErrLimLo { get; set; } /// [%] Lower error limit (usually < 0)
public virtual float ErrLimHi { get; set; } /// [%] Upper error limit (usually > 0)
public virtual float Uncertainty { get; set; } /// [%] Makes error limits tighter: 0 <= Uncertainty <= abs(ErrLimXx)
/// To be replaced by the virtual bench component parameters
public virtual string FeedingPath { get; set; }
public virtual string BenchPath { get; set; }
public virtual string OutputPath { get; set; }
public virtual string MetersPath { get; set; }
/// Results
public virtual DateTime TimeStart { get; set; } /// Date and time of the test start
public virtual DateTime TimeEnd { get; set; } /// Date and time of the test end
public virtual int RepetitionNr { get; set; } /// Repetition number from the set of repeated tests (1...)
public virtual float AmbientTempAve { get; set; } /// [deg.C] Average ambient air temperature
public virtual float AmbientPressAve { get; set; } /// Average ambient air pressure
public virtual float AmbientHumiAve { get; set; } /// [%] Average ambient air relative humidity
public virtual float PressInAvrg { get; set; } /// [Bar] Input water pressure (average)
public virtual float PressInStart { get; set; } /// [Bar]
public virtual float PressInEnd { get; set; } /// [Bar]
public virtual float PressOutAvrg { get; set; } /// [Bar]
public virtual float PressOutStart { get; set; } /// [Bar]
public virtual float PressOutEnd { get; set; } /// [Bar]
public virtual float TempInAvrg { get; set; } /// [deg.C]
public virtual float TempInStart { get; set; } /// [deg.C]
public virtual float TempInEnd { get; set; } /// [deg.C]
public virtual float TempOutAvrg { get; set; } /// [deg.C]
public virtual float TempOutStart { get; set; } /// [deg.C]
public virtual float TempOutEnd { get; set; } /// [deg.C]
public virtual float TempDivAvrg { get; set; } /// [deg.C]
public virtual float TempDivStart { get; set; } /// [deg.C]
public virtual float TempDivEnd { get; set; } /// [deg.C]
public virtual float MassStartRaw { get; set; } /// [kg]
public virtual float MassStart { get; set; } /// [kg]
public virtual float MassEndRaw { get; set; } /// [kg]
public virtual float MassEnd { get; set; } /// [kg]
public virtual float MassDiff { get; set; } /// [kg]
public virtual float DensityIn { get; set; } /// [kg/m3]
public virtual float DensityOut { get; set; } /// [kg/m3]
public virtual float DensityDiv { get; set; } /// [kg/m3]
public virtual float Buoyancy { get; set; } ///TODO -> map
public virtual float FlowMass { get; set; } /// [kg/h] calculated from conventional true value
public virtual float FlowVolume { get; set; } /// [l/h] calculated from conventional true value
public virtual float VolumeCTV { get; set; } /// [l] Volume conventional true value
public virtual float VolumeMaster { get; set; } /// [l] Volume from the master flow meter
public virtual float Time { get; set; } /// [s] Measurement time in seconds
public virtual float ErrorMaster { get; set; } /// [%]
public virtual float PulsesMaster { get; set; }
public virtual float ConstMaster { get; set; } /// [pls/l] Pulses per liter master flow meter
public virtual float QRise { get; set; } /// Detected Q_rise of a composed meter
public virtual float QFall { get; set; } /// Detected Q_fall of a composed meter
public virtual float TimeDivStart0 { get; set; }
public virtual float TimeDivStart1 { get; set; }
public virtual float TimeDivStart2 { get; set; }
public virtual float TimeDivStart3 { get; set; }
public virtual float TimeDivStart4 { get; set; }
public virtual float TimeDivStart5 { get; set; }
public virtual float TimeDivEnd0 { get; set; }
public virtual float TimeDivEnd1 { get; set; }
public virtual float TimeDivEnd2 { get; set; }
public virtual float TimeDivEnd3 { get; set; }
public virtual float TimeDivEnd4 { get; set; }
public virtual float TimeDivEnd5 { get; set; }
public TestResult()
{
Meters = new List<MeterTestResult>();
CombinedMeters = new List<MeterTestResult>();
}
public TestResult(MetersKind kind)
: this()
{
MetersKind = kind;
if (kind == MetersKind.Single)
{
for (int i = 0; i < Config.Data.WMsCount; i++) Meters.Add(new MeterTestResult(this));
}
else if (kind == MetersKind.Combined)
{
for (int i = 0; i < 2 * Config.Data.CompoundWMsCount; i++) Meters.Add(new MeterTestResult(this));
for (int i = 0; i < Config.Data.CompoundWMsCount; i++) CombinedMeters.Add(new MeterTestResult(this));
}
else if (kind == MetersKind.HeatMeter)
{
/// TODO: Verify if this is OK
for (int i = 0; i < Config.Data.WMsCount; i++) Meters.Add(new MeterTestResult(this));
}
}
public TestResult(Test test, int repetitionNr, MetersKind kind)
: this(kind)
{
if (test.Repeats == 1)
{
Name = test.Name;
}
else
{
Name = string.Format("{0} ({1}/{2})", test.Name, repetitionNr, test.Repeats);
}
RepetitionNr = repetitionNr;
/// Copy test parameters from Entities.Procedure object
ProcedureName = test.Procedure.Name;
ProtocolTitle = test.Procedure.ProtocolTitle;
/// Copy test parameters from Entities.Test object
TestId = test.Id;
TestName = test.Name;
Part = test.Part;
Qfrom = test.Qfrom;
Qto = test.Qto;
Volume = test.Volume;
TstTime = test.TstTime;
Repeats = test.Repeats;
Emptying = test.Draining;
Zeroing = test.Zeroing;
PumpPower = PumpPower;
Time2MassMsrmt = test.TimeStop2Mass;
Method = test.Method;
ErrLimLo = test.ErrLimLo;
ErrLimHi = test.ErrLimHi;
Uncertainty = test.Uncertainty;
FeedingPath = test.FeedingPath;
BenchPath = test.BenchPath;
OutputPath = test.OutputPath;
MetersPath = test.MetersPath;
}
public override string ToString()
{
return string.Format("batch={0}, procedure={1}, test={2}, {3} {4}", BatchNr, ProcedureName, TestName, TimeStart.ToShortDateString(), TimeStart.ToShortTimeString());
}
}
}
+40
View File
@@ -0,0 +1,40 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System.Collections.Generic;
namespace Config.Entities
{
/// <summary>
/// Stores one transition sequence containing a list of transition steps
/// </summary>
public class TransitionSequence : IHasItemNr
{
public virtual int Id { get; protected set; }
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; } /// Short description
public virtual IList<TransitionStep> TransitionSteps { get; set; }
public TransitionSequence()
{
TransitionSteps = new List<TransitionStep>();
}
public TransitionSequence(string name, int itemNr)
: this()
{
Name = name;
ItemNr = itemNr;
}
public virtual TransitionSequence Clone()
{
TransitionSequence result = new TransitionSequence();
result.Name = Name;
result.Description = Description;
foreach (var step in TransitionSteps) { result.TransitionSteps.Add(step.Clone()); }
return result;
}
}
}
+65
View File
@@ -0,0 +1,65 @@
///
/// Copyright (c) 2013-2015, 2017 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
namespace Config.Entities
{
public class TransitionStep : IHasItemNr, IHasValves
{
public virtual int Id { get; protected set; }
public virtual int ItemNr { get; set; } /// Order of the preparation step
public virtual int Duration { get; set; } /// Duration in seconds
public virtual string Message { get; set; } /// Message
public virtual string EndCondition { get; set; } /// Condition when transition step is finished (next to the duration)
public virtual string ValvesOpen { get; set; } /// List of valves to be opened
public virtual string ValvesClose { get; set; } /// List of valves to be closed
public virtual string RegulValvesPct { get; set; } /// Positions of regulation valves in % separated by ';'
public virtual string PumpWithFMPcts { get; set; } /// Power of FM controlled pumps in % separated by ';'
public virtual TransitionSequence TransitionSequence { get; set; }
/// ------------- Additional stuff not mapped into the database -------------
public TransitionStep()
{
Duration = 5; /// sec.
EndCondition = "None";
}
public TransitionStep(int itemNr, TransitionSequence sequence)
: this()
{
ItemNr = itemNr;
TransitionSequence = sequence;
}
public virtual TransitionStep Clone()
{
TransitionStep result = new TransitionStep(ItemNr, TransitionSequence);
result.Duration = Duration;
result.Message = Message;
result.EndCondition = EndCondition;
result.ValvesOpen = ValvesOpen;
result.ValvesClose = ValvesClose;
result.RegulValvesPct = RegulValvesPct;
result.PumpWithFMPcts = PumpWithFMPcts;
return result;
}
public virtual string ToString(string indent)
{
string result = "";
result += indent + "ItemNr = " + ItemNr.ToString() + ", ";
result += indent + "Duration = " + Duration.ToString() + ", ";
result += indent + "Message = " + Message + ", ";
result += indent + "EndCondition = " + EndCondition + ", ";
result += indent + "ValvesOpen = " + ValvesOpen + ", ";
result += indent + "ValvesClose = " + ValvesClose + ", ";
result += indent + "RegulValvesPct = " + RegulValvesPct + ", ";
result += indent + "PumpsWithFMPct = " + PumpWithFMPcts + Environment.NewLine;
return result;
}
}
}
+24
View File
@@ -0,0 +1,24 @@
///
/// Copyright (c) 2013-2017 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
namespace Config.Entities
{
public class User //: Users.IUser
{
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 int Number { get; set; }
public virtual string Password { get; set; }
public virtual DateTime LastPwChange { get; set; }
public virtual IList<Group> Groups { get; set; } //User can be a member of a list of groups
public User()
{
Groups = new List<Group>();
}
}
}
+38
View File
@@ -0,0 +1,38 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
namespace Config.Entities
{
public class VirtualBenchSequence : IHasItemNr
{
public virtual int Id { get; protected set; }
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; } /// Short description
public virtual IList<VirtualBenchStep> VirtualBenchSteps { get; set; }
public VirtualBenchSequence()
{
VirtualBenchSteps = new List<VirtualBenchStep>();
}
public VirtualBenchSequence(string name, int itemNr)
: this()
{
Name = name;
ItemNr = itemNr;
}
public virtual VirtualBenchSequence Clone()
{
VirtualBenchSequence result = new VirtualBenchSequence();
result.Name = Name;
result.Description = Description;
foreach (var step in VirtualBenchSteps) { result.VirtualBenchSteps.Add(step.Clone()); }
return result;
}
}
}
+39
View File
@@ -0,0 +1,39 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
namespace Config.Entities
{
public class VirtualBenchStep : IHasItemNr
{
public virtual int Id { get; protected set; }
public virtual int ItemNr { get; set; } /// Order of the preparation step
public virtual int Duration { get; set; } /// Duration in seconds
///
public virtual VirtualBenchSequence VirtualBenchSequence { get; set; }
/// ------------- Additional stuff not mapped into the database -------------
public VirtualBenchStep()
{
Duration = 5; /// sec.
}
public VirtualBenchStep(int itemNr, VirtualBenchSequence sequence)
: this()
{
ItemNr = itemNr;
VirtualBenchSequence = sequence;
}
public virtual VirtualBenchStep Clone()
{
VirtualBenchStep result = new VirtualBenchStep(ItemNr, VirtualBenchSequence);
return result;
}
}
}
+78
View File
@@ -0,0 +1,78 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/// This class holds the watermeter type specific data
/// that have all watermaters of the same type in common
namespace Config.Entities
{
public class WMType
{
// mapped
public virtual int Id { get; protected set; } /// primary key
public virtual DateTime CreateTime { get; set; } /// Date and time of the creation or change
public virtual string CreateUserName { get; set; } /// Name of the user who has created or changed this procedure
public virtual string CreateDescription { get; set; } /// Description\
public virtual string Name { get; set; } /// type name
public virtual float PulseRate { get; set; } /// Pulses per Liter
// not yet mapped
public virtual int IdentNr { get; protected set; } /// identification number of watermeter tzpe
public virtual int Diameter { get; set; } /// nominal diameter
public virtual int Pressure { get; set; } /// nominal pressure
public virtual int Length { get; set; } /// construction length
public virtual int Temperatur { get; set; } /// nominal temperature in C
public virtual float NominalFlow { get; set; } /// nominal flow Qn
/// ------------- Additional stuff not mapped into the database -------------
public WMType()
{
}
public static WMType DefaultWMType()
{
WMType procedure = new WMType()
{
CreateTime = DateTime.Now,
CreateUserName = Users.GlobalData.CurrentUser.UserName,
CreateDescription = "A default water meter created.",
Name = "Watermeter",
PulseRate = 1000,
};
return procedure;
}
public virtual WMType Clone()
{
WMType result = new WMType();
result.CreateTime = CreateTime;
result.CreateUserName = CreateUserName;
result.CreateDescription = CreateDescription;
result.Name = Name;
result.PulseRate = PulseRate;
return result;
}
public override string ToString()
{
string result = "";
result += "WMTpe: " + Environment.NewLine;
result += " Name = " + Name + Environment.NewLine;
result += " Created by = " + CreateUserName + Environment.NewLine;
result += " Created on = " + CreateTime.ToString() + Environment.NewLine;
result += " Description = " + CreateDescription + Environment.NewLine;
result += " Pulse rate = " + PulseRate.ToString() + Environment.NewLine;
return result;
}
}
}
+40
View File
@@ -0,0 +1,40 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using FluentNHibernate;
namespace Config.Entities
{
public class Watermeter
{
public virtual int Id { get; protected set; } /// primary key
public virtual DateTime CreateTime { get; set; } /// Date and time of the creation or change
public virtual string CreateUserName { get; set; } /// Name of the user who has created or changed this procedure
public virtual string CreateDescription { get; set; } /// Description
/// mapped
public virtual string Serial { get; set; } /// serial number
public virtual WMType WMType { get; set; } /// type of watermeter
///
/// <summary>
/// Load a watermeter from the database
/// </summary>
public static Watermeter LoadBySerialnr(string SerialNr)
{
IList<Watermeter> ListOfWatermeters = FluentCommon.CreateSession(Users.Entities.DBKind.Results)
.CreateQuery("FROM Watermeter WHERE Serial = :SerialNrParameter")
.SetParameter("SerialNrParameter", SerialNr)
.List<Watermeter>();
if (ListOfWatermeters.Count > 0) return ListOfWatermeters.ElementAt(0);
return null;
}
}
}
+236
View File
@@ -0,0 +1,236 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Windows.Forms;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using Config.Resources;
namespace Config
{
public static class FluentCommon
{
/// <summary>
/// Session factories for regular sessions.
/// </summary>
public static ISessionFactory[] SessionFactories = new ISessionFactory[(int)Users.Entities.DBKind.Count];
/// <summary>
/// NHibernate session factory (to create the database session 'SessionFactory')
/// </summary>
/// <returns>A database session</returns>
static ISessionFactory CreateSessionFactory(Users.Entities.DBKind database)
{
Users.Entities.DBType dbType;
string connectionString;
switch (database)
{
default:
case Users.Entities.DBKind.Config:
dbType = Data.CurrentBench.ProceduresDBSettings.DbType;
connectionString = Data.CurrentBench.ProceduresDBSettings.ConnectionString;
break;
case Users.Entities.DBKind.Results:
dbType = Data.CurrentBench.WaterMetersDBSettings.DbType;
connectionString = Data.CurrentBench.WaterMetersDBSettings.ConnectionString;
break;
}
return CreateSessionFactory(database, dbType, connectionString, false);
}
/// <summary>
/// NHibernate session factory (to create the database session 'SessionFactory')
/// </summary>
/// <returns>A database session</returns>
public static ISessionFactory CreateSessionFactory(Users.Entities.DBKind database, Users.Entities.DBType dbType, string connectionString, bool createDB)
{
try
{
FluentConfiguration cfg = Fluently.Configure();
switch (dbType)
{
default:
case Users.Entities.DBType.SQLite:
cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString));
break;
case Users.Entities.DBType.MySql:
cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString));
break;
}
switch (database)
{
default:
case Users.Entities.DBKind.Config:
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Data>());
break;
case Users.Entities.DBKind.Results:
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Data>());
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);
}
/// Create a NHibernate session for the given database
public static ISession CreateSession(Users.Entities.DBKind database)
{
int ix = (int)database;
if (ix < 0 || ix >= (int)Users.Entities.DBKind.Count) return null;
if (SessionFactories[ix] == null) SessionFactories[ix] = CreateSessionFactory(database);
return SessionFactories[ix].OpenSession();
}
public static void SaveToDb(Users.Entities.DBKind database, object obj)
{
SaveToDb(CreateSession(database), obj);
}
public static void SaveToDb(ISession session, object obj)
{
using (var transaction = session.BeginTransaction())
{
session.SaveOrUpdate(obj);
try { transaction.Commit(); }
catch { }
}
}
public static void DeleteFromDb(Users.Entities.DBKind database, object obj)
{
DeleteFromDb(CreateSession(database), obj);
}
public static void DeleteFromDb(ISession session, object obj)
{
using (var transaction = session.BeginTransaction())
{
session.Delete(obj);
transaction.Commit();
}
}
/// <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(Users.Entities.DBType dbType, string connectionString)
{
ISessionFactory sessionFactory = CreateSessionFactory(Users.Entities.DBKind.Config, dbType, connectionString, true);
if (sessionFactory == null) return false;
/// Populate the database
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
///
/// Prepare all groups
///
var testers = new Users.Entities.Group((int)Users.Grp.GID.Testers, Strings.Tester);
var testingSpecialists = new Users.Entities.Group((int)Users.Grp.GID.TestingSpecialists, Strings.Testing_Specialist);
var headOfLab = new Users.Entities.Group((int)Users.Grp.GID.HeadOfLab, Strings.Head_of_Lab);
var maintenanceSpecialists = new Users.Entities.Group((int)Users.Grp.GID.MaintenanceSpecialists, Strings.Maintenance_Specialist);
var metrologists = new Users.Entities.Group((int)Users.Grp.GID.Metrologists, Strings.Metrologist);
var calibrationSpecialists = new Users.Entities.Group((int)Users.Grp.GID.CalibrationSpecialists, Strings.Calibration_Specialist);
var administrators = new Users.Entities.Group((int)Users.Grp.GID.Administrators, Strings.Administrator);
/// Create the user 'admin' add his groups
var admin = new Users.Entities.User
{
UserName = Data.AdminUsername,
FullName = Strings.Administrator,
LastPwChange = DateTime.Now
};
admin.SetPassword(Data.AdminPassword);
admin.AddGroup(testers);
admin.AddGroup(testingSpecialists);
admin.AddGroup(headOfLab);
admin.AddGroup(maintenanceSpecialists);
admin.AddGroup(metrologists);
admin.AddGroup(calibrationSpecialists);
admin.AddGroup(administrators);
session.SaveOrUpdate(admin);
///// Create the control board component
//var cmpnt = (new BenchControl.Elde.ControlBoardCfg(new BenchControl.Elde.ControlBoardFactory())).CreateDbEntity();
//session.SaveOrUpdate(cmpnt);
transaction.Commit();
}
}
return true;
}
/// <summary>
/// Create an empty water meters database
/// </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 CreateEmptyResultsDB(Users.Entities.DBType dbType, string connectionString)
{
ISessionFactory sessionFactory = CreateSessionFactory(Users.Entities.DBKind.Results, dbType, connectionString, true);
if (sessionFactory == null) return false;
/// Populate the database
//using (var session = sessionFactory.OpenSession())
//{
// using (var transaction = session.BeginTransaction())
// {
// /// Create one component
// var cmpnt = (new BenchControl.Elde.ControlBoardCfg("CB", 1)).CreateDbEntity();
// session.SaveOrUpdate(cmpnt);
// transaction.Commit();
// }
//}
return true;
}
}
}
+32
View File
@@ -0,0 +1,32 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class BenchPathMap : ClassMap<BenchPath>
{
public BenchPathMap()
{
Id(x => x.Id);
Map(x => x.ItemNr);
Map(x => x.Name);
Map(x => x.Qfrom);
Map(x => x.Qto);
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.StopBFValve);
Map(x => x.ValvesOpen)
.CustomType("StringClob")
.CustomSqlType("varchar(8000)");
Map(x => x.ValvesClose)
.CustomType("StringClob")
.CustomSqlType("varchar(8000)");
}
}
}
+28
View File
@@ -0,0 +1,28 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class ComponentMap : ClassMap<Component>
{
public ComponentMap()
{
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.ClassName);
Map(x => x.ParentName);
Map(x => x.ItemNr);
Map(x => x.Mode);
Map(x => x.Logging);
Map(x => x.Parameters)
.CustomType("StringClob")
.CustomSqlType("varchar(8000)");
HasMany(x => x.Corrections)
.OrderBy("Measurement")
.Cascade.All();
}
}
}
+22
View File
@@ -0,0 +1,22 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class ComponentProcedureMap : ClassMap<ComponentProcedure>
{
public ComponentProcedureMap()
{
Id(x => x.Id);
Map(x => x.CmpntName);
Map(x => x.Parameters)
.CustomType("StringClob")
.CustomSqlType("varchar(8000)");
References(x => x.Procedure);
}
}
}
+22
View File
@@ -0,0 +1,22 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class ComponentTestMap : ClassMap<ComponentTest>
{
public ComponentTestMap()
{
Id(x => x.Id);
Map(x => x.CmpntName);
Map(x => x.Parameters)
.CustomType("StringClob")
.CustomSqlType("varchar(8000)");
References(x => x.Test);
}
}
}
+28
View File
@@ -0,0 +1,28 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class FeedingPathMap : ClassMap<FeedingPath>
{
public FeedingPathMap()
{
Id(x => x.Id);
Map(x => x.ItemNr);
Map(x => x.Name);
Map(x => x.Qfrom);
Map(x => x.Qto);
Map(x => x.Pump);
Map(x => x.RegulValvesPct);
Map(x => x.ValvesOpen)
.CustomType("StringClob")
.CustomSqlType("varchar(8000)");
Map(x => x.ValvesClose)
.CustomType("StringClob")
.CustomSqlType("varchar(8000)");
}
}
}
+17
View File
@@ -0,0 +1,17 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
namespace Config.Mappings
{
class GroupMap : ClassMap<Entities.Group>
{
public GroupMap()
{
Id(x => x.Id);
Map(x => x.Gid);
Map(x => x.Name);
}
}
}
+35
View File
@@ -0,0 +1,35 @@
///
/// Copyright (c) 2016 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
#if HEAT_METERS
class HeatMetersPathMap : ClassMap<HeatMetersPath>
{
public HeatMetersPathMap()
{
Id(x => x.Id);
Map(x => x.ItemNr);
Map(x => x.Name);
Map(x => x.TempWarmFrom);
Map(x => x.TempWarmTo);
Map(x => x.TempColdFrom);
Map(x => x.TempColdTo);
Map(x => x.TMeterRefWarm1);
Map(x => x.TMeterRefWarm2);
Map(x => x.TMeterRefCold1);
Map(x => x.TMeterRefCold2);
Map(x => x.TMeterWorkWarm1);
Map(x => x.TMeterWorkWarm2);
Map(x => x.TMeterWorkCold1);
Map(x => x.TMeterWorkCold2);
}
}
#endif
}
@@ -0,0 +1,18 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class MeasurementCorrectionMap : ClassMap<MeasurementCorrection>
{
public MeasurementCorrectionMap()
{
Id(x => x.Id);
Map(x => x.Measurement);
Map(x => x.Correction);
}
}
}
+29
View File
@@ -0,0 +1,29 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class MeterTestResultMap : ClassMap<MeterTestResult>
{
public MeterTestResultMap()
{
Id(x => x.Id);
References(x => x.TestResult);
Map(x => x.Disabled);
Map(x => x.SerialNr);
Map(x => x.EndState);
Map(x => x.VolumeStart);
Map(x => x.VolumeEnd);
Map(x => x.VolumeMeter);
Map(x => x.VolumeRef);
Map(x => x.VolumeErrorPct);
Map(x => x.PulsesMeter);
Map(x => x.PulsesPerLiter);
Map(x => x.PulsesMaster);
Map(x => x.Time);
}
}
}
+61
View File
@@ -0,0 +1,61 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class MetersPathMap : ClassMap<MetersPath>
{
public MetersPathMap()
{
Id(x => x.Id);
Map(x => x.ItemNr);
Map(x => x.Name);
#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
}
}
}
+35
View File
@@ -0,0 +1,35 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class OutputPathMap : ClassMap<OutputPath>
{
public OutputPathMap()
{
Id(x => x.Id);
Map(x => x.ItemNr);
Map(x => x.Name);
Map(x => x.Qfrom);
Map(x => x.Qto);
Map(x => x.RegulValve);
Map(x => x.FlowMeter);
Map(x => x.PidCoef);
Map(x => x.StartValve);
Map(x => x.Diverter);
Map(x => x.TempDiv);
Map(x => x.Scale)
.Column("Balance");
Map(x => x.EmptyTankValve);
Map(x => x.ValvesOpen)
.CustomType("StringClob")
.CustomSqlType("varchar(8000)");
Map(x => x.ValvesClose)
.CustomType("StringClob")
.CustomSqlType("varchar(8000)");
}
}
}
+46
View File
@@ -0,0 +1,46 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class ProcedureMap : ClassMap<Procedure>
{
public ProcedureMap()
{
Id(x => x.Id);
Map(x => x.ItemNr);
Map(x => x.Name);
Map(x => x.Description);
Map(x => x.CreationUser);
Map(x => x.CreationTime);
Map(x => x.LastChgUser);
Map(x => x.LastChgTime);
Map(x => x.LongDescription);
Map(x => x.ProcedureState);
Map(x => x.Revision);
Map(x => x.PredecessorId);
Map(x => x.ObtainedByCopy);
Map(x => x.MetersKind);
Map(x => x.Watermeters);
Map(x => x.ProtocolTitle);
Map(x => x.DataEntry);
Map(x => x.ResultsPrinter);
Map(x => x.ResultsWriter);
Map(x => x.TransitionStart);
Map(x => x.TransitionEnd);
////Map(x => x.MetrologicalClass);
////HasOne(x => x.WMType);
HasMany(x => x.MoreParams)
.Cascade.All();
HasMany(x => x.Tests)
.OrderBy("ItemNr")
.Cascade.All();
}
}
}
+61
View File
@@ -0,0 +1,61 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
/// Author: Milan Hanajik
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class TestMap : ClassMap<Test>
{
public TestMap()
{
Id(x => x.Id);
Map(x => x.ItemNr);
Map(x => x.Name);
Map(x => x.Part);
Map(x => x.Publish);
Map(x => x.Evaluate);
Map(x => x.Qfrom);
Map(x => x.Qto);
Map(x => x.Volume);
Map(x => x.TstTime);
Map(x => x.Repeats);
Map(x => x.Draining)
.Column("Emptying");
Map(x => x.Zeroing);
Map(x => x.PumpPower);
Map(x => x.MassRepeats);
Map(x => x.MassSpread);
Map(x => x.MassMethod)
.CustomType<byte>();
Map(x => x.TimeBeforeFlow);
Map(x => x.TimeFlow2Mass);
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.TolerRed)
.Column("TolerRed"); /// ???
Map(x => x.RedType); /// ???
Map(x => x.FeedingPath);
Map(x => x.BenchPath);
Map(x => x.OutputPath);
Map(x => x.MetersPath);
#if HEAT_METERS
Map(x => x.HeatMetersPath);
#endif
Map(x => x.RelTransBefore);
Map(x => x.RelTransBetween);
Map(x => x.RelTransAfter);
Map(x => x.TransitionAfter);
HasMany(x => x.MoreParams)
.Cascade.All();
References(x => x.Procedure);
}
}
}
+109
View File
@@ -0,0 +1,109 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class TestResultMap : ClassMap<TestResult>
{
public TestResultMap()
{
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.BatchNr);
Map(x => x.PurchaseOrder);
Map(x => x.MetersKind);
HasMany(x => x.Meters)
.Cascade.All();
HasMany(x => x.CombinedMeters)
.Cascade.All();
Map(x => x.ProcedureName);
Map(x => x.ProtocolTitle);
Map(x => x.TestId);
Map(x => x.TestName);
Map(x => x.Part);
Map(x => x.Qfrom);
Map(x => x.Qto);
Map(x => x.Volume);
Map(x => x.TstTime);
Map(x => x.Repeats);
Map(x => x.Emptying);
Map(x => x.Zeroing);
Map(x => x.PumpPower);
Map(x => x.Time2MassMsrmt);
Map(x => x.Method);
Map(x => x.ErrLimLo);
Map(x => x.ErrLimHi);
Map(x => x.Uncertainty);
Map(x => x.FeedingPath)
.CustomType("StringClob")
.CustomSqlType("varchar(4000)");
Map(x => x.BenchPath)
.CustomType("StringClob")
.CustomSqlType("varchar(4000)");
Map(x => x.OutputPath)
.CustomType("StringClob")
.CustomSqlType("varchar(4000)");
Map(x => x.MetersPath)
.CustomType("StringClob")
.CustomSqlType("varchar(4000)");
Map(x => x.TimeStart);
Map(x => x.TimeEnd);
Map(x => x.RepetitionNr);
Map(x => x.AmbientTempAve);
Map(x => x.AmbientPressAve);
Map(x => x.AmbientHumiAve);
Map(x => x.PressInAvrg);
Map(x => x.PressInStart);
Map(x => x.PressInEnd);
Map(x => x.PressOutAvrg);
Map(x => x.PressOutStart);
Map(x => x.PressOutEnd);
Map(x => x.TempInAvrg);
Map(x => x.TempInStart);
Map(x => x.TempInEnd);
Map(x => x.TempOutAvrg);
Map(x => x.TempOutStart);
Map(x => x.TempOutEnd);
Map(x => x.TempDivAvrg);
Map(x => x.TempDivStart);
Map(x => x.TempDivEnd);
Map(x => x.MassStartRaw);
Map(x => x.MassStart);
Map(x => x.MassEndRaw);
Map(x => x.MassEnd);
Map(x => x.MassDiff);
Map(x => x.DensityIn);
Map(x => x.DensityOut);
Map(x => x.DensityDiv);
Map(x => x.FlowMass); /// from conventional true value
Map(x => x.FlowVolume); /// from conventional true value
Map(x => x.VolumeCTV); /// volume conventional true value
Map(x => x.VolumeMaster); /// volume from the master flow meter
Map(x => x.Time); /// measurement time in seconds
Map(x => x.ErrorMaster);
Map(x => x.PulsesMaster);
Map(x => x.ConstMaster); /// Pulses per liter master flow meter
Map(x => x.QRise);
Map(x => x.QFall);
Map(x => x.TimeDivStart0);
Map(x => x.TimeDivStart1);
Map(x => x.TimeDivStart2);
Map(x => x.TimeDivStart3);
Map(x => x.TimeDivStart4);
Map(x => x.TimeDivStart5);
Map(x => x.TimeDivEnd0);
Map(x => x.TimeDivEnd1);
Map(x => x.TimeDivEnd2);
Map(x => x.TimeDivEnd3);
Map(x => x.TimeDivEnd4);
Map(x => x.TimeDivEnd5);
}
}
}
+22
View File
@@ -0,0 +1,22 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class TransitionSequenceMap : ClassMap<TransitionSequence>
{
public TransitionSequenceMap()
{
Id(x => x.Id);
Map(x => x.ItemNr);
Map(x => x.Name);
Map(x => x.Description);
HasMany(x => x.TransitionSteps)
.OrderBy("ItemNr")
.Cascade.All();
}
}
}
+30
View File
@@ -0,0 +1,30 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class TransitionStepMap : ClassMap<TransitionStep>
{
public TransitionStepMap()
{
Id(x => x.Id);
Map(x => x.ItemNr);
Map(x => x.Duration);
Map(x => x.Message);
Map(x => x.EndCondition);
Map(x => x.ValvesOpen)
.CustomType("StringClob")
.CustomSqlType("varchar(8000)");
Map(x => x.ValvesClose)
.CustomType("StringClob")
.CustomSqlType("varchar(8000)");
Map(x => x.RegulValvesPct);
Map(x => x.PumpWithFMPcts);
References(x => x.TransitionSequence);
}
}
}
+22
View File
@@ -0,0 +1,22 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
namespace Config.Mappings
{
class UserMap : ClassMap<Entities.User>
{
public UserMap()
{
Id(x => x.Id);
Map(x => x.UserName).Column("Name");
Map(x => x.Number);
Map(x => x.Password);
Map(x => x.FullName).Column("Description");
Map(x => x.LastPwChange);
HasMany(x => x.Groups)
.Cascade.All();
}
}
}
@@ -0,0 +1,22 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class VirtualBenchSequenceMap : ClassMap<VirtualBenchSequence>
{
public VirtualBenchSequenceMap()
{
Id(x => x.Id);
Map(x => x.ItemNr);
Map(x => x.Name);
Map(x => x.Description);
HasMany(x => x.VirtualBenchSteps)
.OrderBy("ItemNr")
.Cascade.All();
}
}
}
+20
View File
@@ -0,0 +1,20 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class VirtualBenchStepMap : ClassMap<VirtualBenchStep>
{
public VirtualBenchStepMap()
{
Id(x => x.Id);
Map(x => x.ItemNr);
Map(x => x.Duration);
References(x => x.VirtualBenchSequence);
}
}
}
+20
View File
@@ -0,0 +1,20 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
namespace Config.Mappings
{
class WMTypeMap : ClassMap<Entities.WMType>
{
public WMTypeMap()
{
Id(x => x.Id);
Map(x => x.CreateTime);
Map(x => x.CreateUserName);
Map(x => x.CreateDescription);
Map(x => x.Name);
Map(x => x.PulseRate);
}
}
}
+19
View File
@@ -0,0 +1,19 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
namespace Config.Mappings
{
class WatermeterMap : ClassMap<Entities.Watermeter>
{
public WatermeterMap()
{
Id(x => x.Id);
Map(x => x.Serial);
// HasOne(x => x.WMType)
// .Cascade.All();
References(x => x.WMType);
}
}
}
+36
View File
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
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("Config")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Sensus")]
[assembly: AssemblyProduct("Config")]
[assembly: AssemblyCopyright("Copyright © 2013 - 2016 Sensus Slovensko a.s.")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("3fc3ff67-7386-4aff-9855-bef33d5fa0d3")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// 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("2.12.537.0")]
[assembly: AssemblyFileVersion("2.12.537.0")]
+164
View File
@@ -0,0 +1,164 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Config.Resources {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Strings {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Strings() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Config.Resources.Strings", typeof(Strings).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Administrator.
/// </summary>
internal static string Administrator {
get {
return ResourceManager.GetString("Administrator", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Calibration Specialist.
/// </summary>
internal static string Calibration_Specialist {
get {
return ResourceManager.GetString("Calibration_Specialist", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Cannot open DB Cause 0.
/// </summary>
internal static string Cannot_open_DB_Cause_0 {
get {
return ResourceManager.GetString("Cannot_open_DB_Cause_0", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Error.
/// </summary>
internal static string Error
{
get
{
return ResourceManager.GetString("Error", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Failed.
/// </summary>
internal static string Failed {
get {
return ResourceManager.GetString("Failed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Head of Lab.
/// </summary>
internal static string Head_of_Lab {
get {
return ResourceManager.GetString("Head_of_Lab", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Maintenance Specialist.
/// </summary>
internal static string Maintenance_Specialist {
get {
return ResourceManager.GetString("Maintenance_Specialist", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Metrologist.
/// </summary>
internal static string Metrologist {
get {
return ResourceManager.GetString("Metrologist", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Passed.
/// </summary>
internal static string Passed {
get {
return ResourceManager.GetString("Passed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Tester.
/// </summary>
internal static string Tester {
get {
return ResourceManager.GetString("Tester", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Testing Specialist.
/// </summary>
internal static string Testing_Specialist {
get {
return ResourceManager.GetString("Testing_Specialist", resourceCulture);
}
}
}
}
+123
View File
@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Error" xml:space="preserve">
<value>Chyba</value>
</data>
</root>
+153
View File
@@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Administrator" xml:space="preserve">
<value>Administrator</value>
</data>
<data name="Calibration_Specialist" xml:space="preserve">
<value>Kalibriertechniker</value>
</data>
<data name="Head_of_Lab" xml:space="preserve">
<value>Laborleiter</value>
</data>
<data name="Maintenance_Specialist" xml:space="preserve">
<value>Wartungstechniker</value>
</data>
<data name="Metrologist" xml:space="preserve">
<value>Messtechniker</value>
</data>
<data name="Tester" xml:space="preserve">
<value>Prüfer</value>
</data>
<data name="Testing_Specialist" xml:space="preserve">
<value>Prüftechniker</value>
</data>
<data name="Failed" xml:space="preserve">
<value>NiO</value>
</data>
<data name="Passed" xml:space="preserve">
<value>iO</value>
</data>
<data name="Error" xml:space="preserve">
<value>Fehler</value>
</data>
<data name="Cannot_open_DB_Cause_0" xml:space="preserve">
<value>Datenbank kann nicht geöffnet.\\r\\nUrsache:\\r\\n{0}</value>
</data>
</root>
+153
View File
@@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Administrator" xml:space="preserve">
<value>Administrator</value>
</data>
<data name="Calibration_Specialist" xml:space="preserve">
<value>Specjalista ds. kalibracji</value>
</data>
<data name="Head_of_Lab" xml:space="preserve">
<value>Kierownik Laboratorium</value>
</data>
<data name="Maintenance_Specialist" xml:space="preserve">
<value>Konserwator</value>
</data>
<data name="Metrologist" xml:space="preserve">
<value>Metrolog</value>
</data>
<data name="Tester" xml:space="preserve">
<value>Pracownik przeprowadzający testy</value>
</data>
<data name="Testing_Specialist" xml:space="preserve">
<value>Specjalista ds. testów</value>
</data>
<data name="Failed" xml:space="preserve">
<value>Niepowodzenie</value>
</data>
<data name="Passed" xml:space="preserve">
<value>OK</value>
</data>
<data name="Cannot_open_DB_Cause_0" xml:space="preserve">
<value>Nie można otworzyć \\r\\nCause:\\r\\n{0}</value>
</data>
<data name="Error" xml:space="preserve">
<value>Błąd</value>
</data>
</root>
+153
View File
@@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Administrator" xml:space="preserve">
<value>Administrator</value>
</data>
<data name="Calibration_Specialist" xml:space="preserve">
<value>Calibration Specialist</value>
</data>
<data name="Head_of_Lab" xml:space="preserve">
<value>Head of Lab</value>
</data>
<data name="Maintenance_Specialist" xml:space="preserve">
<value>Maintenance Specialist</value>
</data>
<data name="Metrologist" xml:space="preserve">
<value>Metrologist</value>
</data>
<data name="Tester" xml:space="preserve">
<value>Tester</value>
</data>
<data name="Testing_Specialist" xml:space="preserve">
<value>Testing Specialist</value>
</data>
<data name="Failed" xml:space="preserve">
<value>NOK</value>
</data>
<data name="Passed" xml:space="preserve">
<value>OK</value>
</data>
<data name="Cannot_open_DB_Cause_0" xml:space="preserve">
<value>Cannot open database.\\r\\nCause:\\r\\n{0}</value>
</data>
<data name="Error" xml:space="preserve">
<value>Error</value>
</data>
</root>
+153
View File
@@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Administrator" xml:space="preserve">
<value>Администратор</value>
</data>
<data name="Calibration_Specialist" xml:space="preserve">
<value>Специалист по калибровке</value>
</data>
<data name="Head_of_Lab" xml:space="preserve">
<value>Руководитель лаборатории</value>
</data>
<data name="Maintenance_Specialist" xml:space="preserve">
<value>Специалист по техобслуживанию</value>
</data>
<data name="Metrologist" xml:space="preserve">
<value>Метролог</value>
</data>
<data name="Tester" xml:space="preserve">
<value>Контролер</value>
</data>
<data name="Testing_Specialist" xml:space="preserve">
<value>Специалист по тестированию</value>
</data>
<data name="Failed" xml:space="preserve">
<value>NOK</value>
</data>
<data name="Passed" xml:space="preserve">
<value>OK</value>
</data>
<data name="Cannot_open_DB_Cause_0" xml:space="preserve">
<value>Не удается открыть БД.\\r\\nCause:\\r\\n{0}</value>
</data>
<data name="Error" xml:space="preserve">
<value>Ошибка</value>
</data>
</root>
+128
View File
@@ -0,0 +1,128 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 1.3
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">1.3</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1">this is my long string</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
[base64 mime encoded serialized .NET Framework object]
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
[base64 mime encoded string representing a byte array form of the .NET Framework object]
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Administrator" xml:space="preserve">
<value>管理员</value>
</data>
<data name="Calibration_Specialist" xml:space="preserve">
<value>校准专员</value>
</data>
<data name="Failed" xml:space="preserve">
<value>NOK</value>
</data>
<data name="Head_of_Lab" xml:space="preserve">
<value>实验室负责人</value>
</data>
<data name="Maintenance_Specialist" xml:space="preserve">
<value>维护专员</value>
</data>
<data name="Metrologist" xml:space="preserve">
<value>计量者</value>
</data>
<data name="Passed" xml:space="preserve">
<value>好</value>
</data>
<data name="Tester" xml:space="preserve">
<value>测试仪</value>
</data>
<data name="Testing_Specialist" xml:space="preserve">
<value>测试专员</value>
</data>
</root>
+399
View File
@@ -0,0 +1,399 @@
///
/// Copyright (c) 2016 Sensus Metering Systems
///
using System;
using System.Reflection;
using Config.Entities;
namespace Config
{
public enum Unit
{
[Description("---")] None,
[Description("l")] l, /// * 1 liter
[Description("m3")] m3, /// 1000 l
[Description("gal(UK)")] gal_UK, /// 1 gal(UK) = 4.54609 l
[Description("gal(US)")] gal_US, /// 1 gal(US) = 3.78541178 l
[Description("l/h")] lph, /// 1 liter/h
[Description("m3/h")] m3ph, /// * 1 m3/h = 1000 l/h
[Description("g")] g, /// 0.001 kg
[Description("kg")] kg, /// * 1 kilogram
[Description("t")] t, /// 1000 kg
[Description("lb")] lb, /// 0.45359237 kg
[Description("s")] s, /// * 1 second
[Description("min")] min, /// 1 min = 60 s
[Description("hr")] hour, /// 1 hour = 60 min = 3600 s
[Description("ms")] ms, /// 1 ms = 0.001 s
[Description("°C")] C, /// * degree Celsius
[Description("°F")] F, /// degree Fahrenheit
[Description("K")] K, /// degree Kelvin
[Description("Pa")] Pa, /// 1 Pa = 0.01 hPa
[Description("hPa")] hPa, /// 1 hPa = 100 Pa
[Description("kPa")] kPa, /// 1 kPa = 10 HPa
[Description("MPa")] MPa, /// 1 MPa = 10000 hPa
[Description("mbar")] mbar, /// 1 mbar = 1 hPa = 100 Pa
[Description("bar")] bar, /// * 1 Bar = 1000 mbar = 0.1 MPa = 100000 Pa
[Description("inHg")] inHg, /// 1 inHg = 33.864 hPa
[Description("R%")] RPct, /// * 1 R%
[Description("%")] Pct, /// * 1 %
[Description("promile")] Promile, /// 1 promile = 0.1 %
[Description("mm")] mm, /// * 1 millimeter
[Description("cm")] cm, /// 1 cm = 10 mm
[Description("m")] m, /// 1 m = 1000 mm
[Description("in")] inch, /// 1 inch = 25.4 mm
[Description("kg/m3")] kgpm3, /// * 1 kg/m3 = 0.001 kg/l
[Description("kg/l")] kgpl, /// 1 kg/l = 1000 kg/m3
[Description("J")] J, /// * 1 Joul
[Description("kJ")] kJ, /// 1 kJ = 1000 J
[Description("MJ")] MJ, /// 1 MJ = 1000000 J
[Description("Wh")] Wh, /// 1 Wh = 3600 J
[Description("kWh")] kWh, /// 1 kWh = 3600000 J
[Description("MWh")] MWh, /// 1 MWh = 3600000000 J
[Description("pulse/l")] ppl, /// * 1 pulse/l
///
[Description("pulse/kWh")] ppkWh, /// * 1 pulse/kWh
Count
}
public enum Quantity
{
/// Quantities with units and conversions (double -> double)
#if LANG_DE
[Description("Volumen")] Volume,
[Description("Durchfluss")] Flow,
[Description("Masse")] Mass,
[Description("Zeit")] Time,
[Description("Temperatur")] Temperature,
[Description("Druck")] Pressure,
[Description("Feuchtigkeit")] Humidity,
[Description("Fehler")] Error,
[Description("Länge")] Length,
[Description("Dichte")] Density,
[Description("Energie")] Energy,
[Description("Impulse/l")] PulsePerLtr,
[Description("Impulse/kWh")] PulsePerKWh,
/// Quantities without units and conversions
[Description("Nummer")] Number,
[Description("Text")] String,
[Description("Boolean")] Boolean,
[Description("Datum und Uhrzeit")] DateTime,
#elif LANG_PL
[Description("Objętość")] Volume,
[Description("Przepływ")] Flow,
[Description("Masa")] Mass,
[Description("Czas")] Time,
[Description("Temperatura")] Temperature,
[Description("Ciśnienie")] Pressure,
[Description("Wilgotność")] Humidity,
[Description("Błąd")] Error,
[Description("Długość")] Length,
[Description("Gęstość")] Density,
[Description("Energia")] Energy,
[Description("Impulsy/litr")] PulsePerLtr,
[Description("Impulsy/kWh")] PulsePerKWh,
/// Quantities without units and conversions
[Description("Numer")] Number,
[Description("Tekst")] String,
[Description("Boolean")] Boolean,
[Description("Data i czas")] DateTime,
#elif LANG_CS
[Description("Objem")] Volume,
[Description("Průtok")] Flow,
[Description("Hmotnost")] Mass,
[Description("Čas")] Time,
[Description("Teplota")] Temperature,
[Description("Tlak")] Pressure,
[Description("Vlhkost")] Humidity,
[Description("Chyba")] Error,
[Description("Délka")] Length,
[Description("Hustota")] Density,
[Description("Energie")] Energy,
[Description("Pulzy/litr")] PulsePerLtr,
[Description("Pulzy/kWh")] PulsePerKWh,
/// Quantities without units and conversions
[Description("Počet")] Number,
[Description("Text")] String,
[Description("Boolean")] Boolean,
[Description("Datum a čas")] DateTime,
#else
[Description("Volume")] Volume,
[Description("Flow")] Flow,
[Description("Mass")] Mass,
[Description("Time")] Time,
[Description("Temperature")] Temperature,
[Description("Pressure")] Pressure,
[Description("Humidity")] Humidity,
[Description("Error")] Error,
[Description("Length")] Length,
[Description("Density")] Density,
[Description("Energy")] Energy,
[Description("Pulses/liter")] PulsePerLtr,
[Description("Pulses/kWh")] PulsePerKWh,
/// Quantities without units and conversions
[Description("Number")] Number,
[Description("String")] String,
[Description("Boolean")] Boolean,
[Description("Date and time")] DateTime,
#endif
Count,
}
public static class Units
{
public static bool IsUnitless(Quantity quantity)
{
return quantity >= Quantity.Number;
}
public static bool IsDefaultUnit(Unit unit)
{
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.ppl || unit == Unit.ppkWh;
}
public static bool IsQuantity(Unit units, Quantity quantity)
{
return (quantity == GetQuantity(units));
}
public static Quantity GetQuantity(Unit units)
{
switch (units)
{
case Unit.l:
case Unit.m3:
case Unit.gal_UK:
case Unit.gal_US:
return Config.Quantity.Volume;
case Unit.lph:
case Unit.m3ph:
return Config.Quantity.Flow;
case Unit.g:
case Unit.kg:
case Unit.t:
case Unit.lb:
return Config.Quantity.Mass;
case Unit.s:
case Unit.min:
case Unit.hour:
case Unit.ms:
return Config.Quantity.Time;
case Unit.C:
case Unit.F:
case Unit.K:
return Config.Quantity.Temperature;
case Unit.Pa:
case Unit.hPa:
case Unit.mbar:
case Unit.kPa:
case Unit.bar:
case Unit.MPa:
case Unit.inHg:
return Config.Quantity.Pressure;
case Unit.RPct:
return Config.Quantity.Humidity;
case Unit.Pct:
case Unit.Promile:
return Config.Quantity.Error;
case Unit.mm:
case Unit.cm:
case Unit.m:
case Unit.inch:
return Config.Quantity.Length;
case Unit.kgpm3:
case Unit.kgpl:
return Config.Quantity.Density;
case Unit.J:
case Unit.kJ:
case Unit.MJ:
case Unit.Wh:
case Unit.kWh:
case Unit.MWh:
return Config.Quantity.Energy;
case Unit.ppl:
return Config.Quantity.PulsePerLtr;
case Unit.ppkWh:
return Config.Quantity.PulsePerKWh;
default:
return Config.Quantity.Number;
}
}
public static bool IsVolume(Unit units) { return IsQuantity(units, Config.Quantity.Volume); }
public static bool IsFlow(Unit units) { return IsQuantity(units, Config.Quantity.Flow); }
public static bool IsMass(Unit units) { return IsQuantity(units, Config.Quantity.Mass); }
public static bool IsTime(Unit units) { return IsQuantity(units, Config.Quantity.Time); }
public static bool IsTemperature(Unit units) { return IsQuantity(units, Config.Quantity.Temperature); }
public static bool IsPressure(Unit units) { return IsQuantity(units, Config.Quantity.Pressure); }
public static bool IsHumidity(Unit units) { return IsQuantity(units, Config.Quantity.Humidity); }
public static bool IsError(Unit units) { return IsQuantity(units, Config.Quantity.Error); }
public static bool IsLength(Unit units) { return IsQuantity(units, Config.Quantity.Length); }
public static bool IsDensity(Unit units) { return IsQuantity(units, Config.Quantity.Density); }
public static bool IsEnergy(Unit units) { return IsQuantity(units, Config.Quantity.Energy); }
public static bool IsPulsePerLtr(Unit units) { return IsQuantity(units, Config.Quantity.PulsePerLtr); }
public static bool IsPulsePerKWh(Unit units) { return IsQuantity(units, Config.Quantity.PulsePerKWh); }
public static double ConvertTo(Unit units, double v)
{
switch (units)
{
/// Volume: internal representation in l
case Unit.l: return v; /// 1 liter
case Unit.m3: return 0.001 * v; /// 1 m3 = 1000 l
case Unit.gal_UK: return 0.21996925 * v; /// 1 gal(UK) = 4.54609 l
case Unit.gal_US: return 0.26417205 * v; /// 1 gal(US) = 3.78541178 l
/// Flow: internal representation in m3/h
case Unit.lph: return 1000 * v; /// 1 liter/h
case Unit.m3ph: return v; /// 1 m3/h = 1000 l/h
/// Mass: internal representation in kg
case Unit.g: return 1000 * v; /// 1 g = 0.001 kg
case Unit.kg: return v; /// 1 kilogram
case Unit.t: return 0.001 * v; /// 1 t = 1000 kg
case Unit.lb: return 2.2046226 * v; /// 1 lb = 0.45359237 kg
/// Time or duration: internal representation in seconds [s]
case Unit.s: return v;
case Unit.min: return v / 60;
case Unit.hour: return v / 3600;
case Unit.ms: return 1000 * v;
/// Temperature: internal representation in degree C
case Unit.C: return v; /// degree Celsius
case Unit.F: return 1.8 * v + 32; /// degree Fahrenheit
case Unit.K: return v + 273.15; /// degree Kelvin
/// Pressure: internal representation in bar = 0.1 MPa
case Unit.Pa: return 100000 * v; /// 1 hPa = 100 Pa
case Unit.hPa: return 1000 * v; /// 1 hPa = 100 Pa
case Unit.mbar: return 1000 * v; /// 1 mbar = 1 hPa = 100 Pa
case Unit.kPa: return 100 * v; /// 1 kPa = 10 HPa
case Unit.bar: return v; /// 1 bar = 1000 mbar = 100000 Pa
case Unit.MPa: return 0.1 * v; /// 1 MPa = 10000 hPa
case Unit.inHg: return 29.53 * v; /// 1 inHg = 33.864 hPa
/// Error: internal representation in %
case Unit.Pct: return v; /// 1 %
case Unit.Promile: return 10 * v; /// 1 promile = 0.1 %
/// Diameter, length: internal representation in mm
case Unit.mm: return v; /// 1 mm
case Unit.cm: return 0.1 * v; /// 1 cm = 10 mm
case Unit.m: return 0.001 * v; /// 1 m = 1000 mm
case Unit.inch: return v / 25.4; /// 1 inch = 25.4 mm
/// Density: internal representation in kg/m3
case Unit.kgpm3: return v;
case Unit.kgpl: return 0.001 * v;
/// Energy, internal representation in Joul
case Unit.J: return v; /// 1 Joul
case Unit.kJ: return 0.001 * v; /// 1 kJ = 1000 J
case Unit.MJ: return 0.000001 * v; /// 1 kJ = 1000000 J
case Unit.Wh: return v / 3600.0; /// 1 Wh = 3600 J
case Unit.kWh: return v / 3600000.0; /// 1 kWh = 3600000 J
case Unit.MWh: return v / 3600000000.0;/// 1 MWh = 3600000000 J
default: return v;
}
}
public static double ConvertFrom(Unit units, double v)
{
switch (units)
{
/// Volume: internal representation in l
case Unit.l: return v; /// 1 liter
case Unit.m3: return 1000 * v; /// 1000 l
case Unit.gal_UK: return 4.54609 * v; /// 1 gal(UK) = 4.54609 l
case Unit.gal_US: return 3.78541178 * v; /// 1 gal(US) = 3.78541178 l
/// Flow: internal representation in m3/h
case Unit.lph: return 0.001 * v; /// 1 liter/h
case Unit.m3ph: return v; /// 1 m3/h = 1000 l/h
/// Mass: internal representation in kg
case Unit.g: return 0.001 * v; /// 1 g = 0.001 kg
case Unit.kg: return v; /// 1 kilogram
case Unit.t: return 1000 * v; /// 1 t = 1000 kg
case Unit.lb: return 0.45359237 * v; /// 1 lb = 0.45359237 kg
/// Time or duration: internal representation in seconds [s]
case Unit.s: return v;
case Unit.min: return 60 * v;
case Unit.hour: return 3600 * v;
case Unit.ms: return v / 1000;
/// Temperature: internal representation in degree C
case Unit.C: return v; /// degree Celsius
case Unit.F: return 5 * (v-32) / 9; /// degree Fahrenheit
case Unit.K: return v - 273.15; /// degree Kelvin
/// Pressure: internal representation in bar = 0.1 MPa
case Unit.Pa: return 0.00001 * v; /// 1 hPa = 100 Pa
case Unit.hPa: return 0.001 * v; /// 1 hPa = 100 Pa
case Unit.mbar: return 0.001 * v; /// 1 mbar = 1 hPa = 100 Pa
case Unit.kPa: return 0.01 * v; /// 1 kPa = 10 HPa
case Unit.bar: return v; /// 1 bar = 1000 mbar = 100000 Pa
case Unit.MPa: return 10 * v; /// 1 MPa = 10000 hPa
case Unit.inHg: return 0.033864 * v; /// 1 inHg = 33.864 hPa
/// Error: internal representation in %
case Unit.Pct: return v; /// 1 %
case Unit.Promile: return 0.1 * v; /// 1 promile = 0.1 %
/// Diameter, length: internal representation in mm
case Unit.mm: return v; /// 1 mm
case Unit.cm: return 10 * v; /// 1 cm = 10 mm
case Unit.m: return 1000 * v; /// 1 m = 1000 mm
case Unit.inch: return 25.4 * v; /// 1 inch = 25.4 mm
/// Density: internal representation in kg/m3
case Unit.kgpm3: return v;
case Unit.kgpl: return 1000 * v;
/// Energy, internal representation in Joul
case Unit.J: return v; /// 1 Joul
case Unit.kJ: return 1000 * v; /// 1 kJ = 1000 J
case Unit.MJ: return 1000000 * v; /// 1 kJ = 1000000 J
case Unit.Wh: return 3600 * v; /// 1 Wh = 3600 J
case Unit.kWh: return 3600000 * v; /// 1 kWh = 3600000 J
case Unit.MWh: return 3600000000 * v; /// 1 kWh = 3600000000 J
default: return v;
}
}
}
}
+108
View File
@@ -0,0 +1,108 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{6D3384DC-4638-4A92-91A8-F39D900377C6}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>DeviceTest</RootNamespace>
<AssemblyName>DeviceTest</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</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|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<StartupObject>DeviceTest.Program</StartupObject>
</PropertyGroup>
<ItemGroup>
<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" />
<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="DeviceTestDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="DeviceTestDlg.Designer.cs">
<DependentUpon>DeviceTestDlg.cs</DependentUpon>
</Compile>
<Compile Include="LocalSettings.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="DeviceTestDlg.resx">
<DependentUpon>DeviceTestDlg.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>
<DesignTime>True</DesignTime>
</Compile>
<None Include="app.config" />
<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>
<ProjectReference Include="..\Config\Config.csproj">
<Project>{743DF7DB-C7B6-42EB-986D-0F485E5588E4}</Project>
<Name>Config</Name>
</ProjectReference>
<ProjectReference Include="..\TestBenchFramework\TBF.csproj">
<Project>{8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}</Project>
<Name>TBF</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>
+584
View File
@@ -0,0 +1,584 @@
namespace DeviceTest
{
partial class DeviceTestDlg
{
/// <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.parentClassNameComboBox = new System.Windows.Forms.ComboBox();
this.classLabel = new System.Windows.Forms.Label();
this.nameLabel = new System.Windows.Forms.Label();
this.parentNameTextBox = new System.Windows.Forms.TextBox();
this.configureParentButton = new System.Windows.Forms.Button();
this.startButton = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.configureComponent1Button = new System.Windows.Forms.Button();
this.componentNameTextBox = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.component1ClassNameComboBox = new System.Windows.Forms.ComboBox();
this.radioButton4 = new System.Windows.Forms.RadioButton();
this.radioButton3 = new System.Windows.Forms.RadioButton();
this.radioButton2 = new System.Windows.Forms.RadioButton();
this.radioButton1 = new System.Windows.Forms.RadioButton();
this.radioButton0 = new System.Windows.Forms.RadioButton();
this.stopButton = new System.Windows.Forms.Button();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.configureComponent2Button = new System.Windows.Forms.Button();
this.component2NameTextBox = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.component2ClassNameComboBox = new System.Windows.Forms.ComboBox();
this.radioButton24 = new System.Windows.Forms.RadioButton();
this.radioButton23 = new System.Windows.Forms.RadioButton();
this.radioButton22 = new System.Windows.Forms.RadioButton();
this.radioButton21 = new System.Windows.Forms.RadioButton();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.radioButton34 = new System.Windows.Forms.RadioButton();
this.radioButton33 = new System.Windows.Forms.RadioButton();
this.radioButton32 = new System.Windows.Forms.RadioButton();
this.radioButton31 = new System.Windows.Forms.RadioButton();
this.groupBox5 = new System.Windows.Forms.GroupBox();
this.configureComponent3Button = new System.Windows.Forms.Button();
this.component3NameTextBox = new System.Windows.Forms.TextBox();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.component3ClassNameComboBox = new System.Windows.Forms.ComboBox();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.groupBox3.SuspendLayout();
this.groupBox4.SuspendLayout();
this.groupBox5.SuspendLayout();
this.SuspendLayout();
//
// parentClassNameComboBox
//
this.parentClassNameComboBox.FormattingEnabled = true;
this.parentClassNameComboBox.Location = new System.Drawing.Point(77, 19);
this.parentClassNameComboBox.Name = "parentClassNameComboBox";
this.parentClassNameComboBox.Size = new System.Drawing.Size(299, 21);
this.parentClassNameComboBox.TabIndex = 0;
//
// classLabel
//
this.classLabel.AutoSize = true;
this.classLabel.Location = new System.Drawing.Point(11, 22);
this.classLabel.Name = "classLabel";
this.classLabel.Size = new System.Drawing.Size(32, 13);
this.classLabel.TabIndex = 1;
this.classLabel.Text = "Class";
//
// nameLabel
//
this.nameLabel.AutoSize = true;
this.nameLabel.Location = new System.Drawing.Point(11, 47);
this.nameLabel.Name = "nameLabel";
this.nameLabel.Size = new System.Drawing.Size(35, 13);
this.nameLabel.TabIndex = 2;
this.nameLabel.Text = "Name";
//
// parentNameTextBox
//
this.parentNameTextBox.Enabled = false;
this.parentNameTextBox.Location = new System.Drawing.Point(77, 44);
this.parentNameTextBox.Name = "parentNameTextBox";
this.parentNameTextBox.Size = new System.Drawing.Size(299, 20);
this.parentNameTextBox.TabIndex = 3;
//
// configureParentButton
//
this.configureParentButton.Location = new System.Drawing.Point(395, 19);
this.configureParentButton.Name = "configureParentButton";
this.configureParentButton.Size = new System.Drawing.Size(73, 45);
this.configureParentButton.TabIndex = 4;
this.configureParentButton.Text = "Configure";
this.configureParentButton.UseVisualStyleBackColor = true;
this.configureParentButton.Click += new System.EventHandler(this.configureParentButton_Click);
//
// startButton
//
this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.startButton.Location = new System.Drawing.Point(520, 19);
this.startButton.Name = "startButton";
this.startButton.Size = new System.Drawing.Size(73, 45);
this.startButton.TabIndex = 7;
this.startButton.Text = "Start";
this.startButton.UseVisualStyleBackColor = true;
this.startButton.Click += new System.EventHandler(this.startButton_Click);
//
// groupBox1
//
this.groupBox1.Controls.Add(this.configureParentButton);
this.groupBox1.Controls.Add(this.parentNameTextBox);
this.groupBox1.Controls.Add(this.nameLabel);
this.groupBox1.Controls.Add(this.classLabel);
this.groupBox1.Controls.Add(this.parentClassNameComboBox);
this.groupBox1.Location = new System.Drawing.Point(12, 12);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(486, 75);
this.groupBox1.TabIndex = 8;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Parent component";
//
// groupBox2
//
this.groupBox2.Controls.Add(this.configureComponent1Button);
this.groupBox2.Controls.Add(this.componentNameTextBox);
this.groupBox2.Controls.Add(this.label1);
this.groupBox2.Controls.Add(this.label2);
this.groupBox2.Controls.Add(this.component1ClassNameComboBox);
this.groupBox2.Location = new System.Drawing.Point(12, 93);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(486, 75);
this.groupBox2.TabIndex = 9;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Component 1";
//
// configureComponentButton
//
this.configureComponent1Button.Location = new System.Drawing.Point(395, 19);
this.configureComponent1Button.Name = "configureComponentButton";
this.configureComponent1Button.Size = new System.Drawing.Size(73, 45);
this.configureComponent1Button.TabIndex = 4;
this.configureComponent1Button.Text = "Configure";
this.configureComponent1Button.UseVisualStyleBackColor = true;
this.configureComponent1Button.Click += new System.EventHandler(this.configureComponent1Button_Click);
//
// componentNameTextBox
//
this.componentNameTextBox.Enabled = false;
this.componentNameTextBox.Location = new System.Drawing.Point(77, 44);
this.componentNameTextBox.Name = "componentNameTextBox";
this.componentNameTextBox.Size = new System.Drawing.Size(299, 20);
this.componentNameTextBox.TabIndex = 3;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(11, 47);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(35, 13);
this.label1.TabIndex = 2;
this.label1.Text = "Name";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(11, 22);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(32, 13);
this.label2.TabIndex = 1;
this.label2.Text = "Class";
//
// componentClassNameComboBox
//
this.component1ClassNameComboBox.FormattingEnabled = true;
this.component1ClassNameComboBox.Location = new System.Drawing.Point(77, 19);
this.component1ClassNameComboBox.Name = "componentClassNameComboBox";
this.component1ClassNameComboBox.Size = new System.Drawing.Size(299, 21);
this.component1ClassNameComboBox.TabIndex = 0;
//
// radioButton4
//
this.radioButton4.AutoSize = true;
this.radioButton4.Location = new System.Drawing.Point(13, 118);
this.radioButton4.Name = "radioButton4";
this.radioButton4.Size = new System.Drawing.Size(51, 17);
this.radioButton4.TabIndex = 9;
this.radioButton4.TabStop = true;
this.radioButton4.Text = "spare";
this.radioButton4.UseVisualStyleBackColor = true;
this.radioButton4.CheckedChanged += new System.EventHandler(this.radioButton4_CheckedChanged);
//
// radioButton3
//
this.radioButton3.AutoSize = true;
this.radioButton3.Location = new System.Drawing.Point(13, 95);
this.radioButton3.Name = "radioButton3";
this.radioButton3.Size = new System.Drawing.Size(51, 17);
this.radioButton3.TabIndex = 8;
this.radioButton3.TabStop = true;
this.radioButton3.Text = "spare";
this.radioButton3.UseVisualStyleBackColor = true;
this.radioButton3.CheckedChanged += new System.EventHandler(this.radioButton3_CheckedChanged);
//
// radioButton2
//
this.radioButton2.AutoSize = true;
this.radioButton2.Location = new System.Drawing.Point(13, 72);
this.radioButton2.Name = "radioButton2";
this.radioButton2.Size = new System.Drawing.Size(51, 17);
this.radioButton2.TabIndex = 7;
this.radioButton2.TabStop = true;
this.radioButton2.Text = "spare";
this.radioButton2.UseVisualStyleBackColor = true;
this.radioButton2.CheckedChanged += new System.EventHandler(this.radioButton2_CheckedChanged);
//
// radioButton1
//
this.radioButton1.AutoSize = true;
this.radioButton1.Location = new System.Drawing.Point(13, 49);
this.radioButton1.Name = "radioButton1";
this.radioButton1.Size = new System.Drawing.Size(106, 17);
this.radioButton1.TabIndex = 6;
this.radioButton1.TabStop = true;
this.radioButton1.Text = "ReadPressureOp";
this.radioButton1.UseVisualStyleBackColor = true;
this.radioButton1.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged);
//
// radioButton0
//
this.radioButton0.AutoSize = true;
this.radioButton0.Location = new System.Drawing.Point(13, 26);
this.radioButton0.Name = "radioButton0";
this.radioButton0.Size = new System.Drawing.Size(94, 17);
this.radioButton0.TabIndex = 5;
this.radioButton0.TabStop = true;
this.radioButton0.Text = "Stop operation";
this.radioButton0.UseVisualStyleBackColor = true;
this.radioButton0.CheckedChanged += new System.EventHandler(this.radioButton0_CheckedChanged);
//
// stopButton
//
this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.stopButton.Location = new System.Drawing.Point(520, 77);
this.stopButton.Name = "stopButton";
this.stopButton.Size = new System.Drawing.Size(73, 45);
this.stopButton.TabIndex = 10;
this.stopButton.Text = "Stop";
this.stopButton.UseVisualStyleBackColor = true;
this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
//
// groupBox3
//
this.groupBox3.Controls.Add(this.configureComponent2Button);
this.groupBox3.Controls.Add(this.component2NameTextBox);
this.groupBox3.Controls.Add(this.label3);
this.groupBox3.Controls.Add(this.label4);
this.groupBox3.Controls.Add(this.component2ClassNameComboBox);
this.groupBox3.Location = new System.Drawing.Point(12, 174);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(486, 75);
this.groupBox3.TabIndex = 11;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Component 2";
//
// configureComponent2Button
//
this.configureComponent2Button.Location = new System.Drawing.Point(395, 19);
this.configureComponent2Button.Name = "configureComponent2Button";
this.configureComponent2Button.Size = new System.Drawing.Size(73, 45);
this.configureComponent2Button.TabIndex = 4;
this.configureComponent2Button.Text = "Configure";
this.configureComponent2Button.UseVisualStyleBackColor = true;
this.configureComponent2Button.Click += new System.EventHandler(this.configureComponent2Button_Click);
//
// component2NameTextBox
//
this.component2NameTextBox.Enabled = false;
this.component2NameTextBox.Location = new System.Drawing.Point(77, 44);
this.component2NameTextBox.Name = "component2NameTextBox";
this.component2NameTextBox.Size = new System.Drawing.Size(299, 20);
this.component2NameTextBox.TabIndex = 3;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(11, 47);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(35, 13);
this.label3.TabIndex = 2;
this.label3.Text = "Name";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(11, 22);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(32, 13);
this.label4.TabIndex = 1;
this.label4.Text = "Class";
//
// component2ClassNameComboBox
//
this.component2ClassNameComboBox.FormattingEnabled = true;
this.component2ClassNameComboBox.Location = new System.Drawing.Point(77, 19);
this.component2ClassNameComboBox.Name = "component2ClassNameComboBox";
this.component2ClassNameComboBox.Size = new System.Drawing.Size(299, 21);
this.component2ClassNameComboBox.TabIndex = 0;
//
// radioButton24
//
this.radioButton24.AutoSize = true;
this.radioButton24.Location = new System.Drawing.Point(212, 118);
this.radioButton24.Name = "radioButton24";
this.radioButton24.Size = new System.Drawing.Size(51, 17);
this.radioButton24.TabIndex = 9;
this.radioButton24.TabStop = true;
this.radioButton24.Text = "spare";
this.radioButton24.UseVisualStyleBackColor = true;
this.radioButton24.CheckedChanged += new System.EventHandler(this.radioButton24_CheckedChanged);
//
// radioButton23
//
this.radioButton23.AutoSize = true;
this.radioButton23.Location = new System.Drawing.Point(212, 95);
this.radioButton23.Name = "radioButton23";
this.radioButton23.Size = new System.Drawing.Size(51, 17);
this.radioButton23.TabIndex = 8;
this.radioButton23.TabStop = true;
this.radioButton23.Text = "spare";
this.radioButton23.UseVisualStyleBackColor = true;
this.radioButton23.CheckedChanged += new System.EventHandler(this.radioButton23_CheckedChanged);
//
// radioButton22
//
this.radioButton22.AutoSize = true;
this.radioButton22.Location = new System.Drawing.Point(212, 72);
this.radioButton22.Name = "radioButton22";
this.radioButton22.Size = new System.Drawing.Size(51, 17);
this.radioButton22.TabIndex = 7;
this.radioButton22.TabStop = true;
this.radioButton22.Text = "spare";
this.radioButton22.UseVisualStyleBackColor = true;
this.radioButton22.CheckedChanged += new System.EventHandler(this.radioButton22_CheckedChanged);
//
// radioButton21
//
this.radioButton21.AutoSize = true;
this.radioButton21.Location = new System.Drawing.Point(212, 49);
this.radioButton21.Name = "radioButton21";
this.radioButton21.Size = new System.Drawing.Size(106, 17);
this.radioButton21.TabIndex = 6;
this.radioButton21.TabStop = true;
this.radioButton21.Text = "ReadPressureOp";
this.radioButton21.UseVisualStyleBackColor = true;
this.radioButton21.CheckedChanged += new System.EventHandler(this.radioButton21_CheckedChanged);
//
// groupBox4
//
this.groupBox4.Controls.Add(this.radioButton34);
this.groupBox4.Controls.Add(this.radioButton33);
this.groupBox4.Controls.Add(this.radioButton32);
this.groupBox4.Controls.Add(this.radioButton31);
this.groupBox4.Controls.Add(this.radioButton24);
this.groupBox4.Controls.Add(this.radioButton4);
this.groupBox4.Controls.Add(this.radioButton23);
this.groupBox4.Controls.Add(this.radioButton0);
this.groupBox4.Controls.Add(this.radioButton22);
this.groupBox4.Controls.Add(this.radioButton3);
this.groupBox4.Controls.Add(this.radioButton21);
this.groupBox4.Controls.Add(this.radioButton1);
this.groupBox4.Controls.Add(this.radioButton2);
this.groupBox4.Location = new System.Drawing.Point(12, 349);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(581, 145);
this.groupBox4.TabIndex = 12;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "Operations";
//
// radioButton34
//
this.radioButton34.AutoSize = true;
this.radioButton34.Location = new System.Drawing.Point(405, 118);
this.radioButton34.Name = "radioButton34";
this.radioButton34.Size = new System.Drawing.Size(51, 17);
this.radioButton34.TabIndex = 13;
this.radioButton34.TabStop = true;
this.radioButton34.Text = "spare";
this.radioButton34.UseVisualStyleBackColor = true;
this.radioButton34.CheckedChanged += new System.EventHandler(this.radioButton34_CheckedChanged);
//
// radioButton33
//
this.radioButton33.AutoSize = true;
this.radioButton33.Location = new System.Drawing.Point(405, 95);
this.radioButton33.Name = "radioButton33";
this.radioButton33.Size = new System.Drawing.Size(51, 17);
this.radioButton33.TabIndex = 12;
this.radioButton33.TabStop = true;
this.radioButton33.Text = "spare";
this.radioButton33.UseVisualStyleBackColor = true;
this.radioButton33.CheckedChanged += new System.EventHandler(this.radioButton33_CheckedChanged);
//
// radioButton32
//
this.radioButton32.AutoSize = true;
this.radioButton32.Location = new System.Drawing.Point(405, 72);
this.radioButton32.Name = "radioButton32";
this.radioButton32.Size = new System.Drawing.Size(51, 17);
this.radioButton32.TabIndex = 11;
this.radioButton32.TabStop = true;
this.radioButton32.Text = "spare";
this.radioButton32.UseVisualStyleBackColor = true;
this.radioButton32.CheckedChanged += new System.EventHandler(this.radioButton32_CheckedChanged);
//
// radioButton31
//
this.radioButton31.AutoSize = true;
this.radioButton31.Location = new System.Drawing.Point(405, 49);
this.radioButton31.Name = "radioButton31";
this.radioButton31.Size = new System.Drawing.Size(106, 17);
this.radioButton31.TabIndex = 10;
this.radioButton31.TabStop = true;
this.radioButton31.Text = "ReadPressureOp";
this.radioButton31.UseVisualStyleBackColor = true;
this.radioButton31.CheckedChanged += new System.EventHandler(this.radioButton31_CheckedChanged);
//
// groupBox5
//
this.groupBox5.Controls.Add(this.configureComponent3Button);
this.groupBox5.Controls.Add(this.component3NameTextBox);
this.groupBox5.Controls.Add(this.label5);
this.groupBox5.Controls.Add(this.label6);
this.groupBox5.Controls.Add(this.component3ClassNameComboBox);
this.groupBox5.Location = new System.Drawing.Point(12, 255);
this.groupBox5.Name = "groupBox5";
this.groupBox5.Size = new System.Drawing.Size(486, 75);
this.groupBox5.TabIndex = 13;
this.groupBox5.TabStop = false;
this.groupBox5.Text = "Component 3";
//
// configureComponent3Button
//
this.configureComponent3Button.Location = new System.Drawing.Point(395, 19);
this.configureComponent3Button.Name = "configureComponent3Button";
this.configureComponent3Button.Size = new System.Drawing.Size(73, 45);
this.configureComponent3Button.TabIndex = 4;
this.configureComponent3Button.Text = "Configure";
this.configureComponent3Button.UseVisualStyleBackColor = true;
this.configureComponent3Button.Click += new System.EventHandler(this.configureComponent3Button_Click);
//
// component3NameTextBox
//
this.component3NameTextBox.Enabled = false;
this.component3NameTextBox.Location = new System.Drawing.Point(77, 44);
this.component3NameTextBox.Name = "component3NameTextBox";
this.component3NameTextBox.Size = new System.Drawing.Size(299, 20);
this.component3NameTextBox.TabIndex = 3;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(11, 47);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(35, 13);
this.label5.TabIndex = 2;
this.label5.Text = "Name";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(11, 22);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(32, 13);
this.label6.TabIndex = 1;
this.label6.Text = "Class";
//
// component3ClassNameComboBox
//
this.component3ClassNameComboBox.FormattingEnabled = true;
this.component3ClassNameComboBox.Location = new System.Drawing.Point(77, 19);
this.component3ClassNameComboBox.Name = "component3ClassNameComboBox";
this.component3ClassNameComboBox.Size = new System.Drawing.Size(299, 21);
this.component3ClassNameComboBox.TabIndex = 0;
//
// DeviceTestDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(613, 502);
this.Controls.Add(this.groupBox5);
this.Controls.Add(this.groupBox4);
this.Controls.Add(this.groupBox3);
this.Controls.Add(this.stopButton);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.startButton);
this.Controls.Add(this.groupBox1);
this.Name = "DeviceTestDlg";
this.Text = "Device test";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DeviceTestDlg_FormClosing);
this.Load += new System.EventHandler(this.DeviceTestDlg_Load);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.groupBox3.ResumeLayout(false);
this.groupBox3.PerformLayout();
this.groupBox4.ResumeLayout(false);
this.groupBox4.PerformLayout();
this.groupBox5.ResumeLayout(false);
this.groupBox5.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ComboBox parentClassNameComboBox;
private System.Windows.Forms.Label classLabel;
private System.Windows.Forms.Label nameLabel;
private System.Windows.Forms.TextBox parentNameTextBox;
private System.Windows.Forms.Button configureParentButton;
private System.Windows.Forms.Button startButton;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Button configureComponent1Button;
private System.Windows.Forms.TextBox componentNameTextBox;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ComboBox component1ClassNameComboBox;
private System.Windows.Forms.RadioButton radioButton4;
private System.Windows.Forms.RadioButton radioButton3;
private System.Windows.Forms.RadioButton radioButton2;
private System.Windows.Forms.RadioButton radioButton1;
private System.Windows.Forms.RadioButton radioButton0;
private System.Windows.Forms.Button stopButton;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.RadioButton radioButton24;
private System.Windows.Forms.RadioButton radioButton23;
private System.Windows.Forms.RadioButton radioButton22;
private System.Windows.Forms.RadioButton radioButton21;
private System.Windows.Forms.Button configureComponent2Button;
private System.Windows.Forms.TextBox component2NameTextBox;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.ComboBox component2ClassNameComboBox;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.GroupBox groupBox5;
private System.Windows.Forms.Button configureComponent3Button;
private System.Windows.Forms.TextBox component3NameTextBox;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.ComboBox component3ClassNameComboBox;
private System.Windows.Forms.RadioButton radioButton34;
private System.Windows.Forms.RadioButton radioButton33;
private System.Windows.Forms.RadioButton radioButton32;
private System.Windows.Forms.RadioButton radioButton31;
}
}
+835
View File
@@ -0,0 +1,835 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using TBF.BenchControl;
using TBF.BenchControl.Generic;
using TBF.BenchControl.GenericDevices;
using System.Xml.Serialization;
namespace DeviceTest
{
public partial class DeviceTestDlg : Form
{
IList<string> compClasses;
IComponentFactory parentFactory;
IComponentFactory component1Factory;
IComponentFactory component2Factory;
IComponentFactory component3Factory;
IComponentCfg parentCfg;
IComponentCfg component1Cfg;
IComponentCfg component2Cfg;
IComponentCfg component3Cfg;
static IList<TBF.BenchControl.Generic.IDevice> tbfDevices;
static IList<TBF.BenchControl.Generic.IComponent> tbfComponents;
static TBF.BenchControl.Generic.IComponent tbfComponent1forOp;
static TBF.BenchControl.Generic.IComponent tbfComponent2forOp;
static TBF.BenchControl.Generic.IComponent tbfComponent3forOp;
static Thread workerThread;
static bool workerThreadRunning;
static int activeOperationId;
static IOperation operation1;
static IOperation operation2;
static IOperation operation3;
static IOperation operation4;
static IOperation operation21;
static IOperation operation22;
static IOperation operation23;
static IOperation operation24;
static IOperation operation31;
static IOperation operation32;
static IOperation operation33;
static IOperation operation34;
static TBF.Boxes.FloatBox floatBox;
static Event evnt;
static DeviceTestDlg()
{
floatBox = new TBF.Boxes.FloatBox();
floatBox.Format = "F2";
}
public DeviceTestDlg()
{
InitializeComponent();
compClasses = new List<string>();
radioButton0.Checked = true;
stopButton.Enabled = false;
foreach (var componentFactory in TbfComponents.Factories)
{
compClasses.Add(componentFactory.ClassName);
}
tbfComponents = new List<TBF.BenchControl.Generic.IComponent>();
tbfDevices = new List<IDevice>();
}
private void DeviceTestDlg_Load(object sender, EventArgs e)
{
foreach (var clName in compClasses)
{
parentClassNameComboBox.Items.Add(clName);
component1ClassNameComboBox.Items.Add(clName);
component2ClassNameComboBox.Items.Add(clName);
component3ClassNameComboBox.Items.Add(clName);
}
try
{
if (!string.IsNullOrEmpty(Program.LocalSettings.ParentClassName) &&
!string.IsNullOrEmpty(Program.LocalSettings.ParentName) &&
!string.IsNullOrEmpty(Program.LocalSettings.ParentSettings))
{
FactoryFromClassName(Program.LocalSettings.ParentClassName, ref parentFactory);
using (var reader = new StringReader(Program.LocalSettings.ParentSettings))
{
IComponentCfg config = (IComponentCfg)(new XmlSerializer(parentFactory.DefaultConfig().GetType())).Deserialize(reader);
config.Name = Program.LocalSettings.ParentName;
config.ParentName = string.Empty;
config.ItemNr = 0;
config.DebugLevel = Config.Entities.DebugMode.Normal;
config.LogLevel = Config.Entities.LogLevel.Debug;
config.Corrections = null;
config.Factory = parentFactory;
parentCfg = config;
}
parentClassNameComboBox.Text = Program.LocalSettings.ParentClassName;
parentNameTextBox.Text = Program.LocalSettings.ParentName;
}
}
catch
{
parentFactory = null;
parentCfg = null;
parentClassNameComboBox.Text = string.Empty;
parentNameTextBox.Text = string.Empty;
}
try
{
if (!string.IsNullOrEmpty(Program.LocalSettings.ComponentClassName) &&
!string.IsNullOrEmpty(Program.LocalSettings.ComponentName) &&
!string.IsNullOrEmpty(Program.LocalSettings.ComponentSettings))
{
FactoryFromClassName(Program.LocalSettings.ComponentClassName, ref component1Factory);
using (var reader = new StringReader(Program.LocalSettings.ComponentSettings))
{
IComponentCfg config = (IComponentCfg)(new XmlSerializer(component1Factory.DefaultConfig().GetType())).Deserialize(reader);
config.Name = Program.LocalSettings.ComponentName;
config.ParentName = string.IsNullOrEmpty(Program.LocalSettings.ComponentParentName) ? string.Empty : Program.LocalSettings.ComponentParentName;
config.ItemNr = 1;
config.DebugLevel = Config.Entities.DebugMode.Normal;
config.LogLevel = Config.Entities.LogLevel.Debug;
config.Corrections = null;
config.Factory = component1Factory;
component1Cfg = config;
}
component1ClassNameComboBox.Text = Program.LocalSettings.ComponentClassName;
componentNameTextBox.Text = Program.LocalSettings.ComponentName;
UpdateOperations(component1ClassNameComboBox.Text);
}
}
catch
{
component1Factory = null;
component1Cfg = null;
component1ClassNameComboBox.Text = string.Empty;
componentNameTextBox.Text = string.Empty;
}
try
{
if (!string.IsNullOrEmpty(Program.LocalSettings.Component2ClassName) &&
!string.IsNullOrEmpty(Program.LocalSettings.Component2Name) &&
!string.IsNullOrEmpty(Program.LocalSettings.Component2Settings))
{
FactoryFromClassName(Program.LocalSettings.Component2ClassName, ref component2Factory);
using (var reader = new StringReader(Program.LocalSettings.Component2Settings))
{
IComponentCfg config = (IComponentCfg)(new XmlSerializer(component2Factory.DefaultConfig().GetType())).Deserialize(reader);
config.Name = Program.LocalSettings.Component2Name;
config.ParentName = string.IsNullOrEmpty(Program.LocalSettings.Component2ParentName) ? string.Empty : Program.LocalSettings.Component2ParentName;
config.ItemNr = 2;
config.DebugLevel = Config.Entities.DebugMode.Normal;
config.LogLevel = Config.Entities.LogLevel.Debug;
config.Corrections = null;
config.Factory = component2Factory;
component2Cfg = config;
}
component2ClassNameComboBox.Text = Program.LocalSettings.Component2ClassName;
component2NameTextBox.Text = Program.LocalSettings.Component2Name;
UpdateOperations2(component2ClassNameComboBox.Text);
}
}
catch
{
component2Factory = null;
component2Cfg = null;
component2ClassNameComboBox.Text = string.Empty;
component2NameTextBox.Text = string.Empty;
}
try
{
if (!string.IsNullOrEmpty(Program.LocalSettings.Component3ClassName) &&
!string.IsNullOrEmpty(Program.LocalSettings.Component3Name) &&
!string.IsNullOrEmpty(Program.LocalSettings.Component3Settings))
{
FactoryFromClassName(Program.LocalSettings.Component3ClassName, ref component3Factory);
using (var reader = new StringReader(Program.LocalSettings.Component3Settings))
{
IComponentCfg config = (IComponentCfg)(new XmlSerializer(component3Factory.DefaultConfig().GetType())).Deserialize(reader);
config.Name = Program.LocalSettings.Component3Name;
config.ParentName = string.IsNullOrEmpty(Program.LocalSettings.Component3ParentName) ? string.Empty : Program.LocalSettings.Component3ParentName;
config.ItemNr = 3;
config.DebugLevel = Config.Entities.DebugMode.Normal;
config.LogLevel = Config.Entities.LogLevel.Debug;
config.Corrections = null;
config.Factory = component3Factory;
component3Cfg = config;
}
component3ClassNameComboBox.Text = Program.LocalSettings.Component3ClassName;
component3NameTextBox.Text = Program.LocalSettings.Component3Name;
UpdateOperations3(component3ClassNameComboBox.Text);
}
}
catch
{
component3Factory = null;
component3Cfg = null;
component3ClassNameComboBox.Text = string.Empty;
component3NameTextBox.Text = string.Empty;
}
}
void SaveSettings()
{
Program.LocalSettings.ParentClassName = parentClassNameComboBox.Text;
Program.LocalSettings.ParentName = parentNameTextBox.Text;
Program.LocalSettings.ParentSettings = (parentCfg != null) ? parentCfg.CreateDbEntity().Parameters : string.Empty;
Program.LocalSettings.ComponentClassName = component1ClassNameComboBox.Text;
Program.LocalSettings.ComponentName = componentNameTextBox.Text;
Program.LocalSettings.ComponentParentName = (component1Cfg != null) ? component1Cfg.ParentName : string.Empty;
Program.LocalSettings.ComponentSettings = (component1Cfg != null) ? component1Cfg.CreateDbEntity().Parameters : string.Empty;
Program.LocalSettings.Component2ClassName = component2ClassNameComboBox.Text;
Program.LocalSettings.Component2Name = component2NameTextBox.Text;
Program.LocalSettings.Component2ParentName = (component2Cfg != null) ? component2Cfg.ParentName : string.Empty;
Program.LocalSettings.Component2Settings = (component2Cfg != null) ? component2Cfg.CreateDbEntity().Parameters : string.Empty;
Program.LocalSettings.Component3ClassName = component3ClassNameComboBox.Text;
Program.LocalSettings.Component3Name = component3NameTextBox.Text;
Program.LocalSettings.Component3ParentName = (component3Cfg != null) ? component3Cfg.ParentName : string.Empty;
Program.LocalSettings.Component3Settings = (component3Cfg != null) ? component3Cfg.CreateDbEntity().Parameters : string.Empty;
Program.LocalSettings.Save();
}
void UpdateOperations(string className)
{
if (className == "Keithley.TempMeter") radioButton1.Text = "ReadPressureOp";
else if (className == "Network.Camera.CLP1611") radioButton1.Text = "Livestream";
else if (className == "Network.Camera.Roi") radioButton1.Text = "RoiDetection";
else if (className == "Modbus.Easytherm")
{
radioButton1.Text = "SetTemperature(10)";
radioButton2.Text = "SetTemperature(20)";
}
else if (className == "Modbus.TankSelector")
{
radioButton1.Text = "SelectTank 1";
radioButton2.Text = "SelectTank 2";
radioButton3.Text = "SelectTank 3";
radioButton4.Text = "SelectTank -";
}
else radioButton1.Text = "spare";
}
///
void UpdateOperations2(string className)
{
if (className == "Keithley.TempMeter") radioButton21.Text = "ReadPressureOp";
else if (className == "Network.Camera.CLP1611") radioButton21.Text = "Livestream";
else if (className == "Network.Camera.Roi") radioButton21.Text = "RoiDetection";
else if (className == "Modbus.Easytherm")
{
radioButton21.Text = "SetTemperature(10)";
radioButton22.Text = "SetTemperature(20)";
}
else if (className == "Modbus.TankSelector")
{
radioButton21.Text = "SelectTank 1";
radioButton22.Text = "SelectTank 2";
radioButton23.Text = "SelectTank 3";
radioButton24.Text = "SelectTank -";
}
else radioButton21.Text = "spare";
}
///
void UpdateOperations3(string className)
{
if (className == "Keithley.TempMeter") radioButton31.Text = "ReadPressureOp";
else if (className == "Network.Camera.CLP1611") radioButton31.Text = "Livestream";
else if (className == "Network.Camera.Roi") radioButton31.Text = "RoiDetection";
else if (className == "Modbus.Easytherm")
{
radioButton31.Text = "SetTemperature(10)";
radioButton32.Text = "SetTemperature(20)";
}
else if (className == "Modbus.TankSelector")
{
radioButton31.Text = "SelectTank 1";
radioButton32.Text = "SelectTank 2";
radioButton33.Text = "SelectTank 3";
radioButton34.Text = "SelectTank -";
}
else radioButton31.Text = "spare";
}
int GetActiveOperationId()
{
if (radioButton1.Checked) { return 1; }
else if (radioButton2.Checked) { return 2; }
else if (radioButton3.Checked) { return 3; }
else if (radioButton4.Checked) { return 4; }
else if (radioButton21.Checked) { return 21; }
else if (radioButton22.Checked) { return 22; }
else if (radioButton23.Checked) { return 23; }
else if (radioButton24.Checked) { return 24; }
else if (radioButton31.Checked) { return 31; }
else if (radioButton32.Checked) { return 32; }
else if (radioButton33.Checked) { return 33; }
else if (radioButton34.Checked) { return 34; }
else return 0; /// stopOperationRadioButton.Checked
}
private void radioButton0_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
private void radioButton1_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
private void radioButton2_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
private void radioButton3_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
private void radioButton4_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
///
private void radioButton21_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
private void radioButton22_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
private void radioButton23_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
private void radioButton24_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
///
private void radioButton31_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
private void radioButton32_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
private void radioButton33_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
private void radioButton34_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
/// <summary>
/// Updates component factory
/// </summary>
/// <param name="className">Component class name</param>
/// <param name="factory">Reference to a factory</param>
/// <returns>true when factory changed</returns>
bool FactoryFromClassName(string className, ref IComponentFactory factory)
{
foreach (var fac in TbfComponents.Factories)
{
if (className == fac.ClassName)
{
if (factory != fac)
{
factory = fac;
return true;
}
else
{
return false;
}
}
}
if (factory != null)
{
factory = null;
return true;
}
return false;
}
private void configureParentButton_Click(object sender, EventArgs e)
{
bool factoryChanged = FactoryFromClassName(parentClassNameComboBox.Text, ref parentFactory);
if (parentFactory == null)
{
MessageBox.Show("Invalid parent class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (factoryChanged || parentCfg == null)
{
parentCfg = parentFactory.DefaultConfig();
}
IComponentCfgCtrl cfgControl = parentCfg.GetControl();
cfgControl.Config = parentCfg;
cfgControl.Config.ItemNr = 0;
TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg();
cfgForm.TbfComponents = new List<Config.Entities.Component>();
cfgForm.ComponentCfgCtrl = cfgControl;
cfgForm.UnlockAfterStart = true;
DialogResult dr = cfgForm.ShowDialog();
if (dr != DialogResult.OK) return;
parentNameTextBox.Text = parentCfg.Name;
}
private void configureComponent1Button_Click(object sender, EventArgs e)
{
bool factoryChanged = FactoryFromClassName(component1ClassNameComboBox.Text, ref component1Factory);
if (component1Factory == null)
{
MessageBox.Show("Invalid component class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (factoryChanged || component1Cfg == null)
{
component1Cfg = component1Factory.DefaultConfig();
}
IComponentCfgCtrl cfgControl = component1Cfg.GetControl();
cfgControl.Config = component1Cfg;
cfgControl.Config.ItemNr = 1;
TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg();
///
IList<Config.Entities.Component> compEntities = new List<Config.Entities.Component>();
if (parentFactory != null && parentCfg != null) compEntities.Add(parentCfg.CreateDbEntity());
cfgForm.TbfComponents = compEntities;
cfgForm.ComponentCfgCtrl = cfgControl;
cfgForm.UnlockAfterStart = true;
DialogResult dr = cfgForm.ShowDialog();
if (dr != DialogResult.OK) return;
componentNameTextBox.Text = component1Cfg.Name;
UpdateOperations(component1ClassNameComboBox.Text);
}
private void configureComponent2Button_Click(object sender, EventArgs e)
{
bool factoryChanged = FactoryFromClassName(component2ClassNameComboBox.Text, ref component2Factory);
if (component2Factory == null)
{
MessageBox.Show("Invalid component class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (factoryChanged || component2Cfg == null)
{
component2Cfg = component2Factory.DefaultConfig();
}
IComponentCfgCtrl cfgControl = component2Cfg.GetControl();
cfgControl.Config = component2Cfg;
cfgControl.Config.ItemNr = 1;
TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg();
///
IList<Config.Entities.Component> compEntities = new List<Config.Entities.Component>();
if (parentFactory != null && parentCfg != null) compEntities.Add(parentCfg.CreateDbEntity());
if (component1Factory != null && component1Cfg != null) compEntities.Add(component1Cfg.CreateDbEntity());
cfgForm.TbfComponents = compEntities;
cfgForm.ComponentCfgCtrl = cfgControl;
cfgForm.UnlockAfterStart = true;
DialogResult dr = cfgForm.ShowDialog();
if (dr != DialogResult.OK) return;
component2NameTextBox.Text = component2Cfg.Name;
UpdateOperations2(component2ClassNameComboBox.Text);
}
private void configureComponent3Button_Click(object sender, EventArgs e)
{
bool factoryChanged = FactoryFromClassName(component3ClassNameComboBox.Text, ref component3Factory);
if (component3Factory == null)
{
MessageBox.Show("Invalid component class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (factoryChanged || component3Cfg == null)
{
component3Cfg = component3Factory.DefaultConfig();
}
IComponentCfgCtrl cfgControl = component3Cfg.GetControl();
cfgControl.Config = component3Cfg;
cfgControl.Config.ItemNr = 1;
TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg();
///
IList<Config.Entities.Component> compEntities = new List<Config.Entities.Component>();
if (parentFactory != null && parentCfg != null) compEntities.Add(parentCfg.CreateDbEntity());
if (component1Factory != null && component1Cfg != null) compEntities.Add(component1Cfg.CreateDbEntity());
if (component2Factory != null && component2Cfg != null) compEntities.Add(component2Cfg.CreateDbEntity());
cfgForm.TbfComponents = compEntities;
cfgForm.ComponentCfgCtrl = cfgControl;
cfgForm.UnlockAfterStart = true;
DialogResult dr = cfgForm.ShowDialog();
if (dr != DialogResult.OK) return;
component3NameTextBox.Text = component3Cfg.Name;
UpdateOperations3(component3ClassNameComboBox.Text);
}
private void startButton_Click(object sender, EventArgs e)
{
tbfComponents.Clear();
tbfDevices.Clear();
tbfComponent1forOp = null;
operation1 = null;
operation2 = null;
operation3 = null;
operation4 = null;
tbfComponent2forOp = null;
operation21 = null;
operation22 = null;
operation23 = null;
operation24 = null;
tbfComponent3forOp = null;
operation31 = null;
operation32 = null;
operation33 = null;
operation34 = null;
workerThreadRunning = false;
string initializedDeviceName = "none";
try
{
if (parentFactory != null && parentCfg != null)
{
TBF.BenchControl.Generic.IComponent component = parentFactory.GetComponent(parentCfg, tbfComponents);
tbfComponents.Add(component);
IDevice dev = component as IDevice;
if (dev != null)
{
initializedDeviceName = dev.Name;
dev.Initialize();
tbfDevices.Add(dev);
}
}
if (component1Factory != null && component1Cfg != null)
{
TBF.BenchControl.Generic.IComponent component = component1Factory.GetComponent(component1Cfg, tbfComponents);
tbfComponents.Add(component);
tbfComponent1forOp = component;
IDevice dev = component as IDevice;
if (dev != null)
{
initializedDeviceName = dev.Name;
dev.Initialize();
tbfDevices.Add(dev);
}
}
if (component2Factory != null && component2Cfg != null)
{
TBF.BenchControl.Generic.IComponent component2 = component2Factory.GetComponent(component2Cfg, tbfComponents);
tbfComponents.Add(component2);
tbfComponent2forOp = component2;
IDevice dev = component2 as IDevice;
if (dev != null)
{
initializedDeviceName = dev.Name;
dev.Initialize();
tbfDevices.Add(dev);
}
}
if (component3Factory != null && component3Cfg != null)
{
TBF.BenchControl.Generic.IComponent component3 = component3Factory.GetComponent(component3Cfg, tbfComponents);
tbfComponents.Add(component3);
tbfComponent3forOp = component3;
IDevice dev = component3 as IDevice;
if (dev != null)
{
initializedDeviceName = dev.Name;
dev.Initialize();
tbfDevices.Add(dev);
}
}
if (tbfComponents.Count == 0) throw new Exception("There are no components");
SaveSettings(); /// Save settings after successful initialization
workerThread = new Thread(Worker);
workerThread.CurrentCulture = Thread.CurrentThread.CurrentCulture;
workerThread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture;
workerThreadRunning = true;
workerThread.Start();
startButton.Enabled = false;
stopButton.Enabled = true;
configureComponent2Button.Enabled = false;
configureComponent1Button.Enabled = false;
configureParentButton.Enabled = false;
}
catch (Exception exc)
{
workerThreadRunning = false;
workerThread = null;
MessageBox.Show(exc.Message,
string.Format("'{0}' initialization failed", initializedDeviceName),
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
foreach (var dev in tbfDevices) dev.StopDevice();
tbfDevices.Clear();
startButton.Enabled = true;
stopButton.Enabled = false;
configureComponent2Button.Enabled = true;
configureComponent1Button.Enabled = true;
configureParentButton.Enabled = true;
}
}
static void Worker()
{
int activeOperationLocal = 0;
int previousOperation = 0;
if (tbfComponent1forOp is TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter)
{
operation1 = (tbfComponent1forOp as TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox);
}
else if (tbfComponent1forOp is TBF.BenchControl.Network.Camera.CLP1611.Camera)
{
operation1 = (tbfComponent1forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(false);
operation2 = (tbfComponent1forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(true);
}
else if (tbfComponent1forOp is TBF.BenchControl.Network.Camera.Roi.Roi)
{
operation1 = (tbfComponent1forOp as TBF.BenchControl.Network.Camera.Roi.Roi).RoiDetectionOp();
}
else if (tbfComponent1forOp is TBF.BenchControl.Modbus.Easytherm.Easytherm)
{
operation1 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(10);
operation2 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(20);
}
else if (tbfComponent1forOp is TBF.BenchControl.Modbus.TankSelector.TankSelector)
{
//operation1 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(1);
//operation2 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(2);
//operation3 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(3);
//operation4 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(0);
}
if (tbfComponent2forOp is TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter)
{
operation21 = (tbfComponent2forOp as TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox);
}
else if (tbfComponent2forOp is TBF.BenchControl.Network.Camera.CLP1611.Camera)
{
operation21 = (tbfComponent2forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(false);
operation22 = (tbfComponent2forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(true);
}
else if (tbfComponent2forOp is TBF.BenchControl.Network.Camera.Roi.Roi)
{
operation21 = (tbfComponent2forOp as TBF.BenchControl.Network.Camera.Roi.Roi).RoiDetectionOp();
}
else if (tbfComponent2forOp is TBF.BenchControl.Modbus.Easytherm.Easytherm)
{
operation21 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(10);
operation22 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(20);
}
else if (tbfComponent2forOp is TBF.BenchControl.Modbus.TankSelector.TankSelector)
{
//operation21 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(1);
//operation22 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(2);
//operation23 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(3);
//operation24 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(0);
}
if (tbfComponent3forOp is TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter)
{
operation31 = (tbfComponent3forOp as TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox);
}
else if (tbfComponent3forOp is TBF.BenchControl.Network.Camera.CLP1611.Camera)
{
operation31 = (tbfComponent3forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(false);
operation33 = (tbfComponent3forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(true);
}
else if (tbfComponent3forOp is TBF.BenchControl.Network.Camera.Roi.Roi)
{
operation31 = (tbfComponent3forOp as TBF.BenchControl.Network.Camera.Roi.Roi).RoiDetectionOp();
}
else if (tbfComponent3forOp is TBF.BenchControl.Modbus.Easytherm.Easytherm)
{
operation31 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(10);
operation32 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(20);
}
else if (tbfComponent3forOp is TBF.BenchControl.Modbus.TankSelector.TankSelector)
{
//operation31 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(1);
//operation32 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(2);
//operation33 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(3);
//operation34 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(0);
}
while (workerThreadRunning)
{
Thread.Sleep(1000);
if (workerThreadRunning)
{
foreach (var d in tbfDevices) d.RunDeviceBefore();
if (tbfComponent1forOp != null)
{
previousOperation = activeOperationLocal;
activeOperationLocal = activeOperationId;
if (previousOperation == 0 && activeOperationLocal != 0)
{
switch (activeOperationLocal)
{
case 1: if (operation1 != null) operation1.Start(); Debug.WriteLine("op1.Start()"); break;
case 2: if (operation2 != null) operation2.Start(); Debug.WriteLine("op2.Start()"); break;
case 3: if (operation3 != null) operation3.Start(); Debug.WriteLine("op3.Start()"); break;
case 4: if (operation4 != null) operation4.Start(); Debug.WriteLine("op4.Start()"); break;
case 21: if (operation21 != null) operation21.Start(); Debug.WriteLine("op21.Start()"); break;
case 22: if (operation22 != null) operation22.Start(); Debug.WriteLine("op22.Start()"); break;
case 23: if (operation23 != null) operation23.Start(); Debug.WriteLine("op23.Start()"); break;
case 24: if (operation24 != null) operation24.Start(); Debug.WriteLine("op24.Start()"); break;
case 31: if (operation31 != null) operation31.Start(); Debug.WriteLine("op31.Start()"); break;
case 32: if (operation32 != null) operation32.Start(); Debug.WriteLine("op32.Start()"); break;
case 33: if (operation33 != null) operation33.Start(); Debug.WriteLine("op33.Start()"); break;
case 34: if (operation34 != null) operation34.Start(); Debug.WriteLine("op34.Start()"); break;
}
}
else if (previousOperation == activeOperationLocal && activeOperationLocal != 0)
{
switch (activeOperationLocal)
{
case 1: if (operation1 != null) evnt = operation1.Run(); Debug.WriteLine("op1.Run() -> {0}", evnt); break;
case 2: if (operation2 != null) evnt = operation2.Run(); Debug.WriteLine("op2.Run() -> {0}", evnt); break;
case 3: if (operation3 != null) evnt = operation3.Run(); Debug.WriteLine("op3.Run() -> {0}", evnt); break;
case 4: if (operation4 != null) evnt = operation4.Run(); Debug.WriteLine("op4.Run() -> {0}", evnt); break;
case 21: if (operation21 != null) evnt = operation21.Run(); Debug.WriteLine("op21.Run() -> {0}", evnt); break;
case 22: if (operation22 != null) evnt = operation22.Run(); Debug.WriteLine("op22.Run() -> {0}", evnt); break;
case 23: if (operation23 != null) evnt = operation23.Run(); Debug.WriteLine("op23.Run() -> {0}", evnt); break;
case 24: if (operation24 != null) evnt = operation24.Run(); Debug.WriteLine("op24.Run() -> {0}", evnt); break;
case 31: if (operation31 != null) evnt = operation31.Run(); Debug.WriteLine("op31.Run() -> {0}", evnt); break;
case 32: if (operation32 != null) evnt = operation32.Run(); Debug.WriteLine("op32.Run() -> {0}", evnt); break;
case 33: if (operation33 != null) evnt = operation33.Run(); Debug.WriteLine("op33.Run() -> {0}", evnt); break;
case 34: if (operation34 != null) evnt = operation34.Run(); Debug.WriteLine("op34.Run() -> {0}", evnt); break;
default: evnt = Event.None; break;
}
}
else if (previousOperation != 0 && activeOperationLocal == 0)
{
switch (previousOperation)
{
case 1: if (operation1 != null) operation1.Stop(); Debug.WriteLine("op1.Stop()"); break;
case 2: if (operation2 != null) operation2.Stop(); Debug.WriteLine("op2.Stop()"); break;
case 3: if (operation3 != null) operation3.Stop(); Debug.WriteLine("op3.Stop()"); break;
case 4: if (operation4 != null) operation4.Stop(); Debug.WriteLine("op4.Stop()"); break;
case 21: if (operation21 != null) operation21.Stop(); Debug.WriteLine("op21.Stop()"); break;
case 22: if (operation22 != null) operation22.Stop(); Debug.WriteLine("op22.Stop()"); break;
case 23: if (operation23 != null) operation23.Stop(); Debug.WriteLine("op23.Stop()"); break;
case 24: if (operation24 != null) operation24.Stop(); Debug.WriteLine("op24.Stop()"); break;
case 31: if (operation31 != null) operation31.Stop(); Debug.WriteLine("op31.Stop()"); break;
case 32: if (operation32 != null) operation32.Stop(); Debug.WriteLine("op32.Stop()"); break;
case 33: if (operation33 != null) operation33.Stop(); Debug.WriteLine("op33.Stop()"); break;
case 34: if (operation34 != null) operation34.Stop(); Debug.WriteLine("op34.Stop()"); break;
}
}
}
foreach (var d in tbfDevices) d.RunDeviceAfter();
}
}
foreach (var d in tbfDevices) d.StopDevice();
}
private void stopButton_Click(object sender, EventArgs e)
{
Cursor = Cursors.WaitCursor;
workerThreadRunning = false;
workerThread.Join(5000);
workerThread = null;
Cursor = Cursors.Default;
startButton.Enabled = true;
stopButton.Enabled = false;
configureParentButton.Enabled = true;
configureComponent1Button.Enabled = true;
configureComponent2Button.Enabled = true;
configureComponent3Button.Enabled = true;
}
private void DeviceTestDlg_FormClosing(object sender, FormClosingEventArgs e)
{
Cursor = Cursors.WaitCursor;
if (workerThread != null)
{
workerThreadRunning = false;
workerThread.Join(3000);
workerThread = null;
}
Cursor = Cursors.Default;
SaveSettings();
Cursor = Cursors.Default;
}
}
}
+120
View File
@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
+126
View File
@@ -0,0 +1,126 @@
using System;
using System.IO;
using System.Text;
using System.Xml.Serialization;
namespace DeviceTest
{
/// <summary>
/// Class to be serialized to an XML file...
/// </summary>
[XmlRootAttribute("DeviceTest")]
public class LocalSettings
{
public string ParentClassName;
public string ParentName;
public string ParentSettings;
public string ComponentClassName;
public string ComponentName;
public string ComponentParentName;
public string ComponentSettings;
public string Component2ClassName;
public string Component2Name;
public string Component2ParentName;
public string Component2Settings;
public string Component3ClassName;
public string Component3Name;
public string Component3ParentName;
public string Component3Settings;
public LocalSettings()
{
}
/// <summary>
/// Load public fields of this class from the XML file.
/// </summary>
/// <returns>LocalSettings object or null when Load() fails</returns>
public static LocalSettings Load(string fileName)
{
try
{
using (TextReader reader = new StreamReader(fileName))
{
LocalSettings ls = (new XmlSerializer(typeof(LocalSettings))).Deserialize(reader) as LocalSettings;
// Copy the settings just in case De-serialize() completes OK
return ls;
}
}
catch (Exception e)
{
string msg = e.Message;
return null;
}
}
/// <summary>
/// Save public fields of this class to the XML file.
/// </summary>
public void Save()
{
try
{
using (TextWriter writer = new StreamWriter(Program.LocalSettingsFileName))
{
(new XmlSerializer(typeof(LocalSettings))).Serialize(writer, this);
}
}
catch (Exception e)
{
string msg = e.Message;
}
}
/// <summary>
/// Updates history stored in a string array by a new latest string.
/// </summary>
/// <param name="lastStrValue">Last entered string</param>
/// <returns>true = updated and saved</returns>
public bool UpdateHistory(string lastStrValue, ref string[] history)
{
const int MaxHistoryLen = 10;
if (string.IsNullOrEmpty(lastStrValue)) return false;
int currentHistoryLength = (history != null) ? history.Length : 0;
int match = -1;
for (int i = 0; i < currentHistoryLength; i++)
{
if (history[i] == lastStrValue)
{
match = i;
break;
}
}
if (match >= 0 || currentHistoryLength >= MaxHistoryLen)
{
/// History does not have to be extended (because of a match) or should not be extended (because of the lenght)
if (match < 0) match = currentHistoryLength - 1;
for (int j = match; j > 0; j--)
{
history[j] = history[j - 1];
}
history[0] = lastStrValue;
}
else
{
/// History will be extended, new item inserted at the beginning
string[] newHistory = new string[currentHistoryLength + 1];
newHistory[0] = lastStrValue;
for (int j = 1; j <= currentHistoryLength; j++)
{
newHistory[j] = history[j - 1];
}
history = newHistory;
}
Save();
return true;
}
}
}
+111
View File
@@ -0,0 +1,111 @@
///
/// Copyright (c) 2016-2017 Sensus Metering Systems
///
using System;
using System.IO;
using System.Windows.Forms;
using log4net;
namespace DeviceTest
{
static class Program
{
/// Program information
public static string Version; /// version string
public static DateTime BuildDateTime; /// date and time of program build
/// log4net
static ILog log;
const string log4netConfigFName = "log4netConfig.xml";
/// Local settings
public static readonly string LocAppDataDir;
public static readonly string LocalSettingsFileName;
public static readonly string LocalSettingsBackupName;
public static LocalSettings LocalSettings;
static Program()
{
/// Program version string
System.Reflection.Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly();
Version ver = thisAssembly.GetName().Version;
Version = string.Format("{0}.{1}.{2}", ver.Major, ver.Minor, ver.Build);
BuildDateTime = new System.IO.FileInfo(thisAssembly.Location).LastWriteTime;
/// Local program configuration directory including the trailing backslash
LocAppDataDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) +
Path.DirectorySeparatorChar + "TestBenchFramework" + Path.DirectorySeparatorChar;
LocalSettingsFileName = LocAppDataDir + "DeviceTest.xml";
LocalSettingsBackupName = LocAppDataDir + "DeviceTest.backup.xml";
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
///
/// Load the local settings
///
Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsFileName);
if (Program.LocalSettings == null)
{
/// Loading local seetings from regular config file failed. Use the backup
Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsBackupName);
if (Program.LocalSettings == null)
{
MessageBox.Show("Na tomto počítači nebol tento program ani raz spustený.\r\nPoužijú sa základné nastavenia.", "Upozornenie", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Program.LocalSettings = new LocalSettings();
Directory.CreateDirectory(LocAppDataDir);
Program.LocalSettings.Save();
}
else
{
LocalSettings.Save(); /// Save the settings to overwrite the wrong file
}
}
else
{
/// Loading local seetings from the regular config file was successful. Update the backup
File.Copy(Program.LocalSettingsFileName, Program.LocalSettingsBackupName, true);
}
/// Configure and start logging
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(LocAppDataDir + log4netConfigFName));
log = LogManager.GetLogger(typeof(Program));
log.Fatal("--------------------------------------------------------------------------------");
log.Fatal(string.Format("TBF ver.{0}", Version));
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try
{
DeviceTestDlg dlg = new DeviceTestDlg();
Application.Run(dlg);
}
catch (Exception exc)
{
LogException(log, "Exception in Application.Run(DeviceTestDlg)", exc);
MessageBox.Show("Program havaroval:" +
Environment.NewLine + Environment.NewLine + exc.Message +
((exc.InnerException == null) ? string.Empty : (Environment.NewLine + exc.InnerException.Message)) +
Environment.NewLine + exc.StackTrace,
"Pozor!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
static void LogException(ILog log, string description, Exception e)
{
log.FatalFormat("---------------( {0} )---------------", description);
log.FatalFormat("Message : {0}", e.Message);
if (e.InnerException != null)
{
log.FatalFormat("InnerMessage : {0}", e.InnerException.Message);
}
log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace);
log.Fatal("--------------------------------------");
}
}
}
@@ -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("NfcS5_DLL")]
[assembly: AssemblyTitle("DeviceTest")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NfcS5_DLL")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyProduct("DeviceTest")]
[assembly: AssemblyCopyright("Copyright © 2016")]
[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("5954d496-caab-4f7a-bde2-bdc8f47dab19")]
[assembly: Guid("a3e8ad92-6617-4f5c-88ce-346d28120fb7")]
// 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("1.14.0.0")]
[assembly: AssemblyFileVersion("1.14.0.0")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
+63
View File
@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace DeviceTest.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DeviceTest.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}
+117
View File
@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
+26
View File
@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace DeviceTest.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}
+7
View File
@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
+3
View File
@@ -0,0 +1,3 @@
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
@@ -1,16 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.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')" />
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}</ProjectGuid>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{439D0878-C76E-452B-B17D-209A89E91D36}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Sensus.iPerl</RootNamespace>
<AssemblyName>NfcS5_DLL</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<RootNamespace>Dirichlet.Numerics</RootNamespace>
<AssemblyName>Dirichlet.Numerics</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -31,24 +33,12 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<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.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="System.Numerics" />
</ItemGroup>
<ItemGroup>
<Compile Include="NfcHandler\CR95HF_Reader.cs" />
<Compile Include="NfcHandler\MCI_Protocol.cs" />
<Compile Include="NfcHandler\NfcDataHandler.cs" />
<Compile Include="NfcHandler\NFCHeadConfig.cs" />
<Compile Include="NfcHandler\NfcMessageEventArgs.cs" />
<Compile Include="NfcHandler\SERIAL_Driver.cs" />
<Compile Include="NfcHandler\ST25DV_Device.cs" />
<Compile Include="NfcHandler\Tools.cs" />
<Compile Include="Int128.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UInt128.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
@@ -58,4 +48,4 @@
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
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("Dirichlet.Numerics")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Dirichlet.Numerics")]
[assembly: AssemblyCopyright("Copyright © 2012")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("a588abc0-c631-4475-9eab-4163d9f81fed")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// 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("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
File diff suppressed because it is too large Load Diff
+13
View File
@@ -0,0 +1,13 @@
Copyright 2014 Rick Sladkey
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+525
View File
@@ -0,0 +1,525 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<diagram program="umlet" version="12.2">
<zoom_level>8</zoom_level>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>0</y>
<w>40</w>
<h>64</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;48;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.InitialState</type>
<coordinates>
<x>416</x>
<y>8</y>
<w>16</w>
<h>16</h>
</coordinates>
<panel_attributes>i</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>328</x>
<y>48</y>
<w>192</w>
<h>32</h>
</coordinates>
<panel_attributes>'Test Start' transition sequence</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>56</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.RegionEndState</type>
<coordinates>
<x>416</x>
<y>96</y>
<w>16</w>
<h>16</h>
</coordinates>
<panel_attributes/>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>88</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>344</x>
<y>128</y>
<w>160</w>
<h>32</h>
</coordinates>
<panel_attributes>Initialize (single) test results</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>136</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.Decision</type>
<coordinates>
<x>408</x>
<y>176</y>
<w>32</w>
<h>32</h>
</coordinates>
<panel_attributes/>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>184</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.Decision</type>
<coordinates>
<x>408</x>
<y>224</y>
<w>32</w>
<h>32</h>
</coordinates>
<panel_attributes/>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.custom.RegionEndState</type>
<coordinates>
<x>416</x>
<y>272</y>
<w>16</w>
<h>16</h>
</coordinates>
<panel_attributes/>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>232</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>264</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>344</x>
<y>304</y>
<w>160</w>
<h>32</h>
</coordinates>
<panel_attributes>Make the water tank empty</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>312</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.RegionEndState</type>
<coordinates>
<x>416</x>
<y>352</y>
<w>16</w>
<h>16</h>
</coordinates>
<panel_attributes/>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>344</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>272</x>
<y>168</y>
<w>160</w>
<h>128</h>
</coordinates>
<panel_attributes>lt=&lt;-
m2=[Emptying always]</panel_attributes>
<additional_attributes>144;112;24;112;24;24;136;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>408</x>
<y>216</y>
<w>176</w>
<h>160</h>
</coordinates>
<panel_attributes>lt=&lt;-
m2=[Enough room in tank]</panel_attributes>
<additional_attributes>24;144;160;144;160;24;32;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>344</x>
<y>384</y>
<w>160</w>
<h>32</h>
</coordinates>
<panel_attributes>Set the required water flow</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>392</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>328</x>
<y>432</y>
<w>192</w>
<h>32</h>
</coordinates>
<panel_attributes>Measure the 'start' mass of water</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>440</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>344</x>
<y>480</y>
<w>160</w>
<h>32</h>
</coordinates>
<panel_attributes>Start the test (diverter, etc.)</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>488</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.RegionEndState</type>
<coordinates>
<x>416</x>
<y>528</y>
<w>16</w>
<h>16</h>
</coordinates>
<panel_attributes/>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>344</x>
<y>560</y>
<w>160</w>
<h>32</h>
</coordinates>
<panel_attributes>Read intermediate results</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>520</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>568</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.Decision</type>
<coordinates>
<x>408</x>
<y>608</y>
<w>32</w>
<h>32</h>
</coordinates>
<panel_attributes/>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>272</x>
<y>512</y>
<w>160</w>
<h>128</h>
</coordinates>
<panel_attributes>lt=&lt;-
m2=[Test in progress]</panel_attributes>
<additional_attributes>144;24;24;24;24;112;136;112</additional_attributes>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>616</y>
<w>40</w>
<h>64</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;48;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.Text</type>
<coordinates>
<x>424</x>
<y>640</y>
<w>104</w>
<h>24</h>
</coordinates>
<panel_attributes>[Test completed]</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>328</x>
<y>664</y>
<w>192</w>
<h>32</h>
</coordinates>
<panel_attributes>Measure the 'end' mass of water</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>328</x>
<y>712</y>
<w>192</w>
<h>32</h>
</coordinates>
<panel_attributes>Calculate and save this test results</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>672</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>720</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.Decision</type>
<coordinates>
<x>408</x>
<y>760</y>
<w>32</w>
<h>32</h>
</coordinates>
<panel_attributes/>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>768</y>
<w>40</w>
<h>64</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;48;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>408</x>
<y>80</y>
<w>216</w>
<h>712</h>
</coordinates>
<panel_attributes>lt=&lt;-
m2=[More repetitions to be done]</panel_attributes>
<additional_attributes>24;24;200;24;200;696;32;696</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.Text</type>
<coordinates>
<x>264</x>
<y>792</y>
<w>160</w>
<h>24</h>
</coordinates>
<panel_attributes>[All test repetitions completed]</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>328</x>
<y>816</y>
<w>192</w>
<h>32</h>
</coordinates>
<panel_attributes>Stop any running tests, etc. (?)</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>328</x>
<y>864</y>
<w>192</w>
<h>32</h>
</coordinates>
<panel_attributes>'Test End' transition sequence</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>824</y>
<w>40</w>
<h>56</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;40;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>400</x>
<y>872</y>
<w>40</w>
<h>64</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>24;48;24;24</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.FinalState</type>
<coordinates>
<x>416</x>
<y>920</y>
<w>16</w>
<h>16</h>
</coordinates>
<panel_attributes/>
<additional_attributes/>
</element>
</diagram>
+261
View File
@@ -0,0 +1,261 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<diagram program="umlet" version="12.2">
<zoom_level>10</zoom_level>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>400</x>
<y>120</y>
<w>120</w>
<h>40</h>
</coordinates>
<panel_attributes>Load the default
procedure
</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>430</x>
<y>40</y>
<w>50</w>
<h>100</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>30;80;30;30</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.InitialState</type>
<coordinates>
<x>450</x>
<y>60</y>
<w>20</w>
<h>20</h>
</coordinates>
<panel_attributes>i</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>400</x>
<y>190</y>
<w>120</w>
<h>40</h>
</coordinates>
<panel_attributes>Reset valves,
pumps, etc.
</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>430</x>
<y>130</y>
<w>50</w>
<h>80</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>30;60;30;30</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>400</x>
<y>260</y>
<w>120</w>
<h>40</h>
</coordinates>
<panel_attributes>Detect cameras</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>430</x>
<y>200</y>
<w>50</w>
<h>80</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>30;60;30;30</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>370</x>
<y>550</y>
<w>180</w>
<h>110</h>
</coordinates>
<panel_attributes>complex
state
--
some more...
-.</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>370</x>
<y>390</y>
<w>180</w>
<h>60</h>
</coordinates>
<panel_attributes>Display prompt, enable
'Cycle' and 'Test' buttons
and wait for a selection</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>430</x>
<y>320</y>
<w>50</w>
<h>90</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>30;70;30;30</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.RegionEndState</type>
<coordinates>
<x>450</x>
<y>330</y>
<w>20</w>
<h>20</h>
</coordinates>
<panel_attributes/>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>430</x>
<y>270</y>
<w>50</w>
<h>80</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>30;60;30;30</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.Decision</type>
<coordinates>
<x>440</x>
<y>480</y>
<w>40</w>
<h>40</h>
</coordinates>
<panel_attributes/>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>430</x>
<y>420</y>
<w>50</w>
<h>80</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>30;60;30;30</additional_attributes>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>430</x>
<y>490</y>
<w>50</w>
<h>80</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>30;60;30;30</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>620</x>
<y>430</y>
<w>160</w>
<h>40</h>
</coordinates>
<panel_attributes>Disable 'Cycle'
and 'Test' buttons</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.custom.State</type>
<coordinates>
<x>620</x>
<y>360</y>
<w>160</w>
<h>40</h>
</coordinates>
<panel_attributes>Empty the tank</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>450</x>
<y>440</y>
<w>270</w>
<h>80</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>250;30;250;60;30;60</additional_attributes>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>670</x>
<y>370</y>
<w>50</w>
<h>80</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>30;30;30;60</additional_attributes>
</element>
<element>
<type>com.umlet.element.Relation</type>
<coordinates>
<x>440</x>
<y>310</y>
<w>280</w>
<h>70</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>30;30;260;30;260;50</additional_attributes>
</element>
<element>
<type>com.umlet.element.custom.Text</type>
<coordinates>
<x>490</x>
<y>480</y>
<w>180</w>
<h>20</h>
</coordinates>
<panel_attributes>'Empty a tank' selected
</panel_attributes>
<additional_attributes/>
</element>
<element>
<type>com.umlet.element.custom.Text</type>
<coordinates>
<x>290</x>
<y>520</y>
<w>160</w>
<h>20</h>
</coordinates>
<panel_attributes>'Cycle' or 'Test' selected
</panel_attributes>
<additional_attributes/>
</element>
</diagram>
+73
View File
@@ -0,0 +1,73 @@
Otazky:
-------
- ako pouzit T6
- co je 'T to Open' pri RV
- na co sluzia VI2P, VI3P a VI4P
TODO:
-----
- nefunguje pumpa P3
- nahlad na cestu v procedure
- purgeStart a purgeEnd --> transitionSteps/Sequences
- horeuvedene pre RegulValve
- volba procedury nie je zablokovana pocas testov
- vsetky Target... v Process tabe
- Hmotnosti:
1 netarovat, merat okamzitu,
2 nulovacia procedura na tlacitko manualne,
3 pri starte sa spytat ci vynulovat vahy
- Preco sa nenacitaju zmeny v Test-e ???
- pouzit oneskorenie na ventily
- skontrolovat doc (freq v Hz)
Demo version:
- pouzit progress bary na vyber testu
- vycistit Measurement
- simulacia skonci pri druhom 'start_measurement'
- pri simulacii sa meni mass pri merani end-mass (klapka by mala byt vypnuta!)
- otvorit Proceduru (v dalsom okne v zamknutom stave) aj ked je okno Procedures zamknute
- pridat seriove cisla do parametrov komponentov
- zapamatavat si sirky stlpcov v PathsDlg, ... (aj inde)
- skontroluj vsetky ListViewEx-y + skorsie spracovanie vysledkov (dolezite aj pre spravnu tvorbu noveho mena)
- preco posledne okno skace
- chyba spracovanie procedure / metrology2 Tol.Abzug, Fehl.Korr -+
- vsetky mena stlpcov a tabov do Strings.xxx
Testovanie na stanici:
- pouzivat skutocne 'rvalves'
- ked vyberiem priamo Q1, Q2, Q3 (poskonceni predchadzajuceho testu), neprepise sa obsah combo boxu
- prislusne EtPulses by mali ist cez RegisterReader komponent + common RegisterReader pre Master
- ako je to s WM0 ...
- na zaciatku zmerat vahu a dovolit vypustit tanky
- updatovat vahu - obrazok = je nespravna kapacita vahy
- spracovanie vysledkov podla excelu: corr. na hustotu vzduchu (zavazie), corr. na hustotu vody v zav. od teploty
- podpora pre zbieranie vysledkov
- logovanie vysledkov do excelu
- zastavit vodu na konci skusky
- Pri nastavovani prietoku nie je nic vidno
- pouzivat skutocne 'rvalves'
- pri vytvarani testov vyberat cesty podla prietoku
- ked sa zada cesta napisanim mena = skontrolovat
- zapamatat si stav ventilu pri prietoku
- nulovanie = nulovanie vahy
- zmenit text: tarovanie -> vypustanie
- pripravit IDC100: !ReadRegisterOp, Idc100.GetValue-SetValue (na konci), GetState a ukoncenie operacie
- sub-sekvencie pre Q-set a metody
- zobrazit typizovanu schemu
Neskor:
- nevidno ci su neulozene zmeny
- upozornenie pri cancel ak su neulozene zmeny
- spravne updatovat tlacitka ked su FixedItems (FixedRows)
- ked odomknem Komponenty tak sa zrusi vyber
- vaha ToString - prve zobrazit capacity
- moznost menenia poradia aj v components
- rozdelit ventily podla ciest?
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

+91
View File
@@ -0,0 +1,91 @@
Assumption
----------
The installation consists of one or more similar test benches. Each test bench is controlled by one PC-based computer. In addition, one or more PC-s can run the same application and manipulated data shared by the test benches (e.g. PC located in offices). All PC-s run the same version of software (this is a must now - Munich - in the future we can try to deal with backward/forward compatibility issues).
Development environment
-----------------------
- Visual Studio 2012 Professional
- Database: MySQL (???)
User iterface
-------------
- WindowsFormsApplication
- Main part of the window occupies a tab control with hidden tabs
(see http://weblogs.asp.net/kdente/archive/2005/11/14/430591.aspx)
Tabs swithing is done programatically
Tabs:
Procedure
- Procedure Info (summary, header)
- Procedure History (changes)
- Procedure Metrology
- Procedure Technical
- Procedure Purge
- Procedure End
- Procedure Adjustment
- Procedure View
- Procedure Inputs
Home
Insert
Results
- Results
- Results D
- Meters Ch
- Temp Ch
- Pressure
Bench parameters
- Technical
- Balance
- Temperature
- Pressure
- Flowmeter
- Density
Logs
Sensus Testbench Framework application settings consist of
----------------------------------------------------------
S1. Local settings stored on each PC
S1.1 language settings, appearance, etc. (no other impact on the system function)
S1.2 specification of databases used to store other settings (see 2.)
There might be several sets of DB settings (1.2) when one should be able to access more test benches. When starting the system, this is indicated on the login screen as 'Test bench'/'Pruefstation'.
S2. Settings stored in databases:
S2.1 'users' (typically shared between all benches - centralized access control)
S2.2 'watermeter_types' info (typically shared between more benches)
S2.3 'test_procedures' (typically shared between more identical benches)
S2.4 'metrological_parameters' of the system (always unique for each system, not shared)
S2.5 'watermeters' info (typically centralized / shared)
S2.6 'test_results' (typically centralized / shared)
etc.
The databases might be running either on the local PC or remote,
each database might be used by a single bench, or shared by more test benches. This configured in 1.2.
Application can be used to:
---------------------------
A1. Change local settings (S1.1, S1.2)
A2. Change settings stored in the databases
A3. Control system and run test procedures - this is only possible on PC-s controlling the benches. When procedure is started, local copy of necessary information from the DB-s is made to avoid problems.
User access control:
--------------------
U1. Access to
U1.1 information read
U1.2 information write/modify
U1.3 action start
is controlled by an access control mechanism.
U2. Users
U3. Groups
Each user is a member of one or more groups. In case needed, a group with a single user is created. Access to information/actions is granted to groups.
Muenich: Grooups are 'Tester',
'Testing specialist',
'Head of lab'
'Maintenance specialist'
'Metrologist'
'Calibration specialist'
U4. When necessary, system prompts user to authenticate himself/herself (login dialog). Authentication is invalidated as follows (optional):
U4.1 When user closes the dialog, which was protected.
U4.2 After certain time period
U4.3 Never
+25
View File
@@ -0,0 +1,25 @@
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
<!-- Print only messages of level WARN or above in the package NHibernate -->
<logger name="NHibernate">
<level value="WARN" />
</logger>
<logger name="TestBenchFramework.BenchControl.StateMachine">
<level value="WARN" />
</logger>
</log4net>
+27
View File
@@ -0,0 +1,27 @@
foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in StateMachine.Worker()
State.Create(...).AddOperation(...).AddOperation(...).EnterState() . . in the sequence in Execute(...)
foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in WaitRunDevsRunOps()
WaitNextTick() (may throw QuitStateMachineException) . . . . . . . . in WaitRunDevsRunOps()
foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in WaitRunDevsRunOps()
IList<Event> events = State.RunOperations(); . . . . . . . . . . . . . in WaitRunDevsRunOps()
foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in WaitRunDevsRunOps()
WaitNextTick() (may throw QuitStateMachineException) . . . . . . . . in WaitRunDevsRunOps()
foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in WaitRunDevsRunOps()
IList<Event> events = State.RunOperations(); . . . . . . . . . . . . . in WaitRunDevsRunOps()
State.Create(...).AddOperation(...).AddOperation(...).EnterState() . . in the sequence in Execute(...)
foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in WaitRunDevsRunOps()
WaitNextTick() (may throw QuitStateMachineException) . . . . . . . . in WaitRunDevsRunOps()
foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in WaitRunDevsRunOps()
IList<Event> events = State.RunOperations(); . . . . . . . . . . . . . in WaitRunDevsRunOps()
foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in WaitRunDevsRunOps()
WaitNextTick() (assume QuitStateMachineException thrown) . . . . . . in WaitRunDevsRunOps()
foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in StateMachine.Worker() catch()
State.RunOperations(); . . . . . . . . . . . . . . . . . . . . . . . . in StateMachine.Worker() catch()
State.Empty.EnterState(); . . . . . . . . . . . . . . . . . . . . . . in StateMachine.Worker() catch()
foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in StateMachine.Worker() catch()
foreach (var device in devices) device.StopDevice(); . . . . . . . . . in StateMachine.Worker() catch()
+11
View File
@@ -0,0 +1,11 @@
Showing tabs in the designer:
- select mainTabControl
- in Properies change SizeMode to normal
- in Properies change ItemSize to 0; 20
Hiding tabs in the designer:
- select mainTabControl
- in Properies change SizeMode to Fixed
- in Poperties change ItemSize to 0; 1
+4
View File
@@ -0,0 +1,4 @@
af242843887f3bdcc52e485483356eaccd37ba67a35941530bd195a8310fc7d5aca8560576dfb62ad5a4bd2df789a5e8be068e62e7c976d6eeed8d63abbd9909
= staratura
-249
View File
@@ -1,249 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.IO.Ports;
//*****************************************************************************
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
// Author: Venkat, Rajeshwar
//*****************************************************************************
namespace Sensus.iPerl.NfcHandler
{
public class CR95HF_Reader
{
private readonly byte [] CR95HF_CMD_ECHO = { 0x55 };
private readonly byte[] CR95HF_CMD_IDN = { 0x01, 0x00 }; //CommandCode(0x01), Length(0x00)
private readonly byte[] CR95HF_CMD_PROTOCOL_SELECT_ON = { 0x02, 0x02, 0x01, 0x0D }; //CommandCode(0x02), Length(0x02), ISO/IEC 15693(0x01), 26 Kbps H, Wait for SOF, 10% modulation, Single subcarrier S, CRC appended (0x0D)
private readonly byte[] CR95HF_CMD_PROTOCOL_SELECT_OFF = { 0x02, 0x02, 0x00, 0x00 }; //CommandCode(0x02), Length(0x02), Protocol off (0x00), Protocol off (0x00)
private List<byte> CR95HF_CMD_SEND_RECEIVE = new List<byte>(); // Command code (0x04), Length (this is number of bytes after this length byte), REQUEST_FLAGS(0x02) and payload (this varies based on device command)
private readonly byte REQUEST_FLAGS = 0x02; // Single subcarrier freq, High data rate, No Inventory/ProtExtn/Select/Address/Option flags
private SERIAL_Driver _SERIAL_Driver;
public event DelNfc_CR95HF_MessageHandler MessageEvent;
private static readonly Dictionary<byte, string> CR95HF_ErrorCodes = new Dictionary<byte, string>
{
{ 0x00 , "Success, No error" },
{ 0x80 , "Success, No error" },
{ 0xA0 , "Success, No error" },
{ 0xC0 , "Success, No error" },
{ 0x82 , "Invalid command length" },
{ 0x83 , "Invalid protocol"},
{ 0x63 , "EEmdSOFerror23, SOF error in high part(duration 2 to 3 etu) in ISO/IEC 14443B"},
{ 0x65 , "EEmdSOFerror10, SOF error in low part(duration 10 to 11 etu) in ISO/IEC 14443B"},
{ 0x66 , "EEmdEgt error, Extended Guard Time error in ISO/IEC 14443B"},
{ 0x67 , "ETr1 Too Big Too long, TR1 send by the card, reception stopped in ISO/IEC 14443BT"},
{ 0x68 , "ETr1Too small Too small, TR1 send by the card in ISO/IEC 14443B"},
{ 0x71 , "EinternalError, Wrong frame format decoded"},
{ 0x85 , "EUserStop, Stopped by user(used only in Card mode)"},
{ 0x86 , "ECommError, Hardware communication error"},
{ 0x87 , "EFrameWaitTOut,Frame wait time out (no valid reception)"},
{ 0x88 , "EInvalidSof,Invalid SOF" },
{ 0x89 , "EBufOverflow,Too many bytes received and data still arriving" },
{ 0x8A , "EFramingError,if start bit = 1 or stop bit = 0"},
{ 0x8B , "EEgtError,EGT time out" },
{ 0x8C , "EInvalidLen,Valid for ISO/IEC 18092, if Length<3" },
{ 0x8D , "ECrcError,CRC error, Valid only for ISO/IEC 18092" },
{ 0x8E , "ERecvLost,CRC error,When reception is lost without EOF received(or subcarrier was lost)"},
{ 0x8F , "ENoField,CRC error,When Listen command detects the absence of external field)"},
{ 0x90 , "EUnintByte,Residual bits in last byte. Useful for ACK/NAK reception of ISO/IEC 14443 Type A"},
{ 0xFF , "Invalid COM port, request Failed" },
};
public CR95HF_Reader(SERIAL_Driver serialdriver)
{
_SERIAL_Driver = serialdriver;
}
#region Message Event
private void OnMessageEvent(string message)
{
NfcMessageEventArgs e = new NfcMessageEventArgs();
e.Message = message;
if (MessageEvent != null)
{
MessageEvent(this, e);
}
e = null;
}
#endregion
public bool OpenConnection(string comport, int baudrate, int databits, Parity parity, StopBits stopbits)
{
return _SERIAL_Driver.OpenConnection(comport, baudrate, databits, parity, stopbits);//Port Intialization and Port Open;
}
public bool CR95HF_Connect()
{
byte[] bytesReceived;
if (_SERIAL_Driver.isOpen())
{
//OnMessageEvent("Tx- " + Tools.ByteArrayToHexString(CR95HF_CMD_IDN));
_SERIAL_Driver.SendMessage(CR95HF_CMD_IDN, CR95HF_CMD_IDN.Length);
if (_SERIAL_Driver.GetRawData().Length == 0) return false;
bytesReceived = _SERIAL_Driver.GetRawData();
//OnMessageEvent("Rx- " + Tools.ByteArrayToHexString(bytesReceived));
if (bytesReceived.Length == 17 && (bytesReceived[0] == 0x00 || bytesReceived[0] == 0x80))
{
string strReader = System.Text.Encoding.ASCII.GetString(bytesReceived);
strReader = strReader.Substring(2, 12);
OnMessageEvent("CombiHead '" + strReader + "'");
}
else
{
if (CR95HF_ErrorCodes.ContainsKey(bytesReceived[0]))
OnMessageEvent("NFC CR95HF error: " + CR95HF_ErrorCodes[bytesReceived[0]]);
else
OnMessageEvent("NFC CR95HF error: Unidentified");
return false;
}
//OnMessageEvent("Tx- " + Tools.ByteArrayToHexString(CR95HF_CMD_PROTOCOL_SELECT_ON));
_SERIAL_Driver.SendMessage(CR95HF_CMD_PROTOCOL_SELECT_ON, CR95HF_CMD_PROTOCOL_SELECT_ON.Length);
if (_SERIAL_Driver.GetRawData().Length == 0) return false;
bytesReceived = _SERIAL_Driver.GetRawData();
//OnMessageEvent("Rx- " + Tools.ByteArrayToHexString(bytesReceived));
if ((bytesReceived[0] != 0x00) && (bytesReceived[0] != 0x80))
{
if (CR95HF_ErrorCodes.ContainsKey(bytesReceived[0]))
OnMessageEvent("NFC CR95HF error: " + CR95HF_ErrorCodes[bytesReceived[0]]);
else
OnMessageEvent("NFC CR95HF error: Unidentified");
return false;
}
}
else
{
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
return false;
}
OnMessageEvent("NFC CR95HF: Protocol ON");
return true;
}
public bool CR95HF_RFProtocolOn()
{
byte[] bytesReceived;
if (_SERIAL_Driver.isOpen())
{
//OnMessageEvent("Tx- " + Tools.ByteArrayToHexString(CR95HF_CMD_PROTOCOL_SELECT_ON));
_SERIAL_Driver.SendMessage(CR95HF_CMD_PROTOCOL_SELECT_ON, CR95HF_CMD_PROTOCOL_SELECT_ON.Length);
if (_SERIAL_Driver.GetRawData().Length == 0) return false;
bytesReceived = _SERIAL_Driver.GetRawData();
//OnMessageEvent("Rx- " + Tools.ByteArrayToHexString(bytesReceived));
if ((bytesReceived[0] != 0x00) && (bytesReceived[0] != 0x80))
{
if (CR95HF_ErrorCodes.ContainsKey(bytesReceived[0]))
OnMessageEvent("NFC CR95HF error: " + CR95HF_ErrorCodes[bytesReceived[0]]);
else
OnMessageEvent("NFC CR95HF error: Unidentified");
return false;
}
}
else
{
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
return false;
}
return true;
}
public bool CR95HF_RFProtocolOff()
{
byte[] bytesReceived;
if (_SERIAL_Driver.isOpen())
{
//OnMessageEvent("Tx- " + Tools.ByteArrayToHexString(CR95HF_CMD_PROTOCOL_SELECT_OFF));
_SERIAL_Driver.SendMessage(CR95HF_CMD_PROTOCOL_SELECT_OFF, CR95HF_CMD_PROTOCOL_SELECT_OFF.Length);
if (_SERIAL_Driver.GetRawData().Length == 0) return false;
bytesReceived = _SERIAL_Driver.GetRawData();
//OnMessageEvent("Rx- " + Tools.ByteArrayToHexString(bytesReceived));
if ((bytesReceived[0] != 0x00) && (bytesReceived[0] != 0x80))
{
if (CR95HF_ErrorCodes.ContainsKey(bytesReceived[0]))
OnMessageEvent("NFC CR95HF error: " + CR95HF_ErrorCodes[bytesReceived[0]]);
else
OnMessageEvent("NFC CR95HF error: Unidentified");
return false;
}
}
else
{
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
return false;
}
return true;
}
public bool CR95HF_SendRecv(byte[] fromDevice, out byte[] toDevice)
{
CR95HF_CMD_SEND_RECEIVE = new List<byte>();
toDevice = null;
if (_SERIAL_Driver.isOpen())
{
CR95HF_CMD_SEND_RECEIVE.Add(0x04);//Command Code
CR95HF_CMD_SEND_RECEIVE.Add((byte)(1 + fromDevice.Length)); // This is bytes from device + 1 (because request flags byte added here)
CR95HF_CMD_SEND_RECEIVE.Add(REQUEST_FLAGS);
CR95HF_CMD_SEND_RECEIVE.AddRange(fromDevice);
//OnMessageEvent("Tx- " + Tools.ByteArrayToHexString(CR95HF_CMD_SEND_RECEIVE.ToArray()));
_SERIAL_Driver.SendMessage(CR95HF_CMD_SEND_RECEIVE.ToArray(), (3 + fromDevice.Length)); // This is bytes from device + 3 (because request flags + length + reader command)
if (_SERIAL_Driver.GetRawData().Length == 0) return false;
byte[] bytesReceived = _SERIAL_Driver.GetRawData();
//OnMessageEvent("Rx- " + Tools.ByteArrayToHexString(bytesReceived));
if ((bytesReceived[0] == 0x00) || (bytesReceived[0] == 0x80) || (bytesReceived[0] == 0xA0) || (bytesReceived[0] == 0xC0))
{
toDevice = new byte[bytesReceived[1]];
for (int i = 0; i < Convert.ToInt32(bytesReceived[1]); i++)
{
toDevice[i] = bytesReceived[2 + i];
}
}
else
{
if (CR95HF_ErrorCodes.ContainsKey(bytesReceived[0]))
OnMessageEvent("NFC CR95HF error: " + CR95HF_ErrorCodes[bytesReceived[0]]);
else
OnMessageEvent("NFC CR95HF error: Unidentified");
return false;
}
}
else
{
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
return false;
}
return true;
}
public bool CR95HF_Echo()
{
if (_SERIAL_Driver.isOpen())
{
if (_SERIAL_Driver.SendMessage(CR95HF_CMD_ECHO, 1))
{
if (_SERIAL_Driver.GetRawData().Length == 0) return false;
byte[] bytesReceived = _SERIAL_Driver.GetRawData();
if ((bytesReceived.Length == 1) && (bytesReceived[0] == CR95HF_CMD_ECHO[0]))
return true;
}
}
else
{
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
return false;
}
return false;
}
}
}
-664
View File
@@ -1,664 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Diagnostics;
using System.IO.Ports;
using System.Timers;
//*****************************************************************************
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
// Author: Venkat, Rajeshwar
//*****************************************************************************
namespace Sensus.iPerl.NfcHandler
{
public class MCI_Protocol
{
private bool MCI_CycleResponseMsgTimeoutFlag = false;
private readonly byte STX = (byte) 0x02;
private readonly byte ETX = (byte) 0x03;
private readonly byte RX_ACK_RESPONSE_MSG_ID = (byte) 0xC9;
private readonly byte RX_ACK_PASSTHROUGH_MSG_ID = (byte)0xCE;
private readonly ushort[] MciPasswords = { 0x0000, 0x55AA, 0x1234, 0x97D1 };
public event DelNfc_MCI_MessageHandler MessageEvent;
public enum StructName
{
Calibration,
Configuration,
Status,
Power,
LCD,
unused1,
unused2,
Diagnostics,
ProductionInfo,
AckResponse,
RadioParams,
RadioInfo,
Command,
EEPROM_Metro,
ST25_Chip_Registers,
IndexReset,
NfcSecurity
}
public static readonly Dictionary<byte, string> StructName_id_to_str = new Dictionary<byte, string>
{
{0, "Calibration"},
{1, "Configuration"},
{2, "Status"},
{3, "Power"},
{4, "LCD"},
{5, "unused1"},
{6, "unused2"},
{7, "Diagnostics"},
{8, "ProductionInfo"},
{9, "AckResponse"},
{10, "RadioParams"},
{11, "RadioInfo"},
{12, "Command"},
{13, "EEPROM_Metro"},
{14, "ST25_Chip_Registers"},
{15, "IndexReset"},
{16, "NfcSecurity"}
};
private string StructToStr(StructName StName)
{
return StructName_id_to_str[Convert.ToByte(StName)];
}
private bool IsValidStruct(StructName StName)
{
return MCI_Protocol.StructName_id_to_str.ContainsKey(Convert.ToByte(StName));
}
public enum MCI_ErrorCodes
{
// these first 0..8 error codes are defined both in
// radio and metro. They can return these codes.
// higher codes will not be returned
Success_No_error = 0,
MCI_Error_MeterAns_Timeout = 1,
MCI_Error_MeterAns_Wrong_CRC = 2,
MCI_Error_MeterAns_Wrong_password = 3,
MCI_Error_MeterAns_Data_not_available = 4,
MCI_Error_MeterAns_Invalid_access = 5,
MCI_Error_MeterAns_Command_not_supported = 6,
MCI_Error_MeterAns_Command_not_executed = 7,
MCI_Error_MeterAns_Unidentified = 8,
// in case higher errors will be defined for the IMI in future
// we keep some distance with the errorcodes...
// host error codes from MCI_Read/Write start from 20:
MCI_Error_Host_Bad_MCI_ID = 20,
MCI_Error_Host_WriteReq_denied = 21,
MCI_Error_Host_WriteReq_bad_device_ans = 22,
MCI_Error_Host_ReadReq_denied = 23,
MCI_Error_Host_ReadReq_bad_device_ans = 24,
MCI_Error_Host_Bad_Payload_Len = 25,
MCI_Error_Host_MeterCRCDoesNotMatch = 26,
MCI_Error_Host_ReadReqBadResponseStructure = 27,
MCI_Error_Host_InvalidStructureID_CannotSendMsg = 28,
MCI_Error_Host_CommandNotInCmdCodeList = 29,
// host error codes from method MCI_TxRequest_RxResponse start from 40
MCI_Error_Host_MB_CTRL_Reg_Read1 = 40,
MCI_Error_Host_MB_disabled1 = 41,
MCI_Error_Host_MB_LEN_Reg_read1 = 42,
MCI_Error_Host_MB_msg_read1 = 43,
MCI_Error_Host_req_not_sent = 44,
MCI_Error_Host_req_not_read_by_iperl = 45,
MCI_Error_Host_MB_CTRL_Reg_Read2 = 46,
MCI_Error_Host_MB_disabled2 = 47,
MCI_Error_Host_MB_LEN_Reg_read2 = 48,
MCI_Error_Host_MB_msg_read2 = 49,
MCI_Error_Host_Timeout = 50,
MCI_Error_Host_msg_write = 51
}
public static string GetMCIErrorMessage(byte ErrorCode)
{
// this is called reflection. The variable names will be
// returned. No need of copys of variable names to string values.
return ((MCI_ErrorCodes) ErrorCode).ToString();
}
public static readonly Dictionary<byte, string> MCI_CmdCodes = new Dictionary<byte, string>
{
{0x00 , "Command: No Operation" },
{0x01 , "Command: Clear Alarms" },
{0x04 , "Command: Clear Diag" },
{0x05 , "Command: Clear Peak flowrate" },
{0x06 , "Command: Enter Active mode" },
{0x07 , "Command: Enter Test mode" },
{0x09 , "Command: Reset Accumulated Volume" },
{0x0A , "Command: Factory Default" },
{0x0B , "Command: Seal" },
{0x0C , "Command: Send radio address to radio FW" },
{0x0D , "Command: Adjust Field" },
{0x0E , "Command: LCD All segments ON" },
{0x0F , "Command: LCD All segments OFF" },
{0x10 , "Command: LCD Even segments ON" },
{0x11 , "Command: LCD Odd segments ON" },
{0x12 , "Command: LNA ON" },
{0x13 , "Command: LNA OFF" },
{0x14 , "Command: EPD ON" },
{0x15 , "Command: EPD OFF" },
{0x16 , "Command: Enter LPM4" },
{0x17 , "Command: Select drive coil connectivity" },
{0x1A , "Command: Enter VRTM" },
{0x1B , "Custom Package Mode ON" },
{0x1C , "Custom Package Mode OFF" },
{0x20 , "Command: Deinstall" },
{0x21 , "Command: Audit Mode" },
{0x22 , "Command: Diagnostic Refresh" },
{0x23 , "Command: NFC Security Reset Access Level" }
};
Dictionary<int, byte[]> MCI_Write_Info = new Dictionary<int, byte[]>();
Dictionary<int, byte[]> MCI_Read_Info = new Dictionary<int, byte[]>();
Dictionary<int, byte[]> MCI_ReadResponse_Info = new Dictionary<int, byte[]>();
private byte MB_Ctrl_Reg_Value;
private byte MB_LEN_Dyn_Register;
private ST25DV_Device _ST25DV_Device;
Tools.Crc16Ccitt Crc = new Tools.Crc16Ccitt(Tools.InitialCrcValue.NonZero1);
private System.Timers.Timer _ReqResCycleTimeoutTimer = new System.Timers.Timer();
public MCI_Protocol(ST25DV_Device ST25DVDevice)
{
_ST25DV_Device = ST25DVDevice;
Init_MCI_Info_MsgId_Password();
}
private void Init_MCI_Info_MsgId_Password()
{
//Write request
byte[] value1 = { 0x40, 0xD1, 0x97 };
MCI_Write_Info.Add(0, value1);//Calibration
byte [] value2 = { 0x41, 0xD1, 0x97 };
MCI_Write_Info.Add(1, value2); //Configuration
byte[] value3 = { 0x42, 0x34, 0x12 };
MCI_Write_Info.Add(2, value3); //Status
byte[] value4 = { 0x43, 0x34, 0x12 };
MCI_Write_Info.Add(3, value4);//Power
byte[] value5 = { 0x44, 0xAA, 0x55 };
MCI_Write_Info.Add(4, value5); //LCD
byte[] value6 = { 0x48, 0xD1, 0x97 };
MCI_Write_Info.Add(8, value6);//ProductionInfo
byte[] value7 = { 0x4E, 0xD1, 0x97 };
MCI_Write_Info.Add(10, value7);//RadioParams
byte[] value8 = { 0x4E, 0xD1, 0x97 };
MCI_Write_Info.Add(11, value8);//RadioInfo
byte[] value9 = { 0x4A, 0xD1, 0x97 };
MCI_Write_Info.Add(12, value9);//Command
byte[] valueIndexResetWrite = { 0x52, 0xD1, 0x97 };
MCI_Write_Info.Add(15, valueIndexResetWrite);//Index reset
byte[] valueNfcSecuritySignedWrite = { 0x54, 0xD1, 0x97 };
MCI_Write_Info.Add(16, valueNfcSecuritySignedWrite);//NFC Security signed message - while writing
//Read request
byte[] value10 = { 0x00, 0xD1, 0x97 };
MCI_Read_Info.Add(0, value10);//Calibration
byte[] value11 = { 0x01, 0xD1, 0x97 };
MCI_Read_Info.Add(1, value11); //Configuration
byte[] value12 = { 0x02, 0x34, 0x12 };
MCI_Read_Info.Add(2, value12); //Status
byte[] value13 = { 0x03, 0x34, 0x12 };
MCI_Read_Info.Add(3, value13);//Power
byte[] value14 = { 0x04, 0xAA, 0x55 };
MCI_Read_Info.Add(4, value14); //LCD
byte[] value15 = { 0x07, 0xAA, 0x55 };
MCI_Read_Info.Add(7, value15); //Diag
byte[] value16 = { 0x08, 0xD1, 0x97 };
MCI_Read_Info.Add(8, value16);//ProductionInfo
byte[] value17 = { 0x0E, 0xD1, 0x97 };
MCI_Read_Info.Add(10, value17);//RadioParams
byte[] value18 = { 0x0E, 0xD1, 0x97 };
MCI_Read_Info.Add(11, value18);//RadioInfo
byte[] valueIndexResetRead = { 0x12, 0xD1, 0x97 };
MCI_Read_Info.Add(15, valueIndexResetRead);//Index reset
byte[] valueNfcSecurityUnsignedRead = { 0x14, 0xD1, 0x97 };
MCI_Read_Info.Add(16, valueNfcSecurityUnsignedRead);//NFC Security non-signed message - while reading
//Read response
byte[] value19 = { 0xC0, 0xD1, 0x97 };
MCI_ReadResponse_Info.Add(0, value19);//Calibration
byte[] value20 = { 0xC1, 0xD1, 0x97 };
MCI_ReadResponse_Info.Add(1, value20); //Configuration
byte[] value21 = { 0xC2, 0x34, 0x12 };
MCI_ReadResponse_Info.Add(2, value21); //Status
byte[] value22 = { 0xC3, 0x34, 0x12 };
MCI_ReadResponse_Info.Add(3, value22);//Power
byte[] value23 = { 0xC4, 0xAA, 0x55 };
MCI_ReadResponse_Info.Add(4, value23); //LCD
byte[] value24 = { 0xC7, 0xAA, 0x55 };
MCI_ReadResponse_Info.Add(7, value24); //Diag
byte[] value25 = { 0xC8, 0xD1, 0x97 };
MCI_ReadResponse_Info.Add(8, value25);//ProductionInfo
byte[] value26 = { 0xC9, 0x00, 0x00 };
MCI_ReadResponse_Info.Add(9, value26);//Ack response
byte[] value27 = { 0xCE, 0xD1, 0x97 };
MCI_ReadResponse_Info.Add(10, value27);//RadioParams
byte[] value28 = { 0xCE, 0xD1, 0x97 };
MCI_ReadResponse_Info.Add(11, value28);//RadioInfo
byte[] valueIndexResetReadResponse = { 0xD2, 0xD1, 0x97 };
MCI_ReadResponse_Info.Add(15, valueIndexResetReadResponse);//Index reset
byte[] valueNfcSecurityUnsignedReadResponse = { 0xD4, 0xD1, 0x97 };
MCI_ReadResponse_Info.Add(16, valueNfcSecurityUnsignedReadResponse);//NFC Security non-signed message response - while reading
}
public bool MCI_Write(StructName StName, ushort offset, byte payloadlength, byte[] inBuffer, int timeoutMs,
out byte errorCode)
{
List<byte> RequestMessage = new List<byte>();
byte[] ResponseMessage = null;
byte[] crcValue = new byte[2];
errorCode = (byte) MCI_ErrorCodes.Success_No_error;
if (payloadlength != inBuffer.Length)
{
OnMessageEvent("Insufficient Payload !, Payload length given as: " + inBuffer.Length);
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_Bad_Payload_Len;
return false;
}
if (StName == StructName.Command)
{
if (MCI_Protocol.MCI_CmdCodes.ContainsKey(inBuffer[0]))
{
OnMessageEvent("Write " + MCI_Protocol.MCI_CmdCodes[inBuffer[0]]);
}
else
{
OnMessageEvent("Command: Not supported");
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_CommandNotInCmdCodeList;
return false;
}
}
else
{
if (!IsValidStruct(StName))
{
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_InvalidStructureID_CannotSendMsg;
OnMessageEvent("Write request:" + MCI_Protocol.GetMCIErrorMessage(errorCode));
return false;
}
OnMessageEvent("Write " + StructToStr(StName) + ": " + Tools.BytesToHex(inBuffer));
}
byte[] MsgId_Password = MCI_Write_Info[(int)StName];
RequestMessage.Add(STX);
RequestMessage.Add(Convert.ToByte(6 + payloadlength));
RequestMessage.Add(MsgId_Password[0]);
RequestMessage.Add((byte)(offset & 0x00FF));
RequestMessage.Add((byte)((offset & 0xFF00) >> 8));
RequestMessage.Add(payloadlength);
for (int i = 0; i < payloadlength; i++) // copy Buffer -> Request Payload
{
RequestMessage.Add(inBuffer[i]);
}
RequestMessage.Add(MsgId_Password[1]);
RequestMessage.Add(MsgId_Password[2]);
// calc CRC and add to request
crcValue = Crc.calcCRCfromMessage(RequestMessage.ToArray());
RequestMessage.Add(crcValue[0]);
RequestMessage.Add(crcValue[1]);
RequestMessage.Add(ETX);
OnMessageEvent("Write Request: " + Tools.BytesToHex(RequestMessage.ToArray()));
errorCode = MCI_TxRequest_RxResponse(RequestMessage.ToArray(), out ResponseMessage, timeoutMs);
if (errorCode != (byte)MCI_ErrorCodes.Success_No_error)
{
OnMessageEvent("WriteReq denied");
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_WriteReq_denied;
return false;
}
//Response message received
byte[] RxCrcComputed = Crc.calcCRCfromMessage(ResponseMessage);
byte[] RxCrcMeter = new byte[2];
// CRC starts at length + STX(1) + lenbyte(1) = RespMsg[1] + 2.
Array.Copy(ResponseMessage, ResponseMessage[1] + 2, RxCrcMeter, 0, 2);
OnMessageEvent(Crc.commentCRC(RxCrcMeter, RxCrcComputed));
if (!Crc.crc_do_match(RxCrcMeter, RxCrcComputed))
{
OnMessageEvent("CRC from Meter and PC do not match!");
errorCode = (byte) MCI_ErrorCodes.MCI_Error_Host_MeterCRCDoesNotMatch;
return false;
}
if ((ResponseMessage[0] == STX)
&& (ResponseMessage[1] == 0x07)
&& (ResponseMessage[2] == RX_ACK_PASSTHROUGH_MSG_ID || ResponseMessage[2] == RX_ACK_RESPONSE_MSG_ID)
&& (ResponseMessage[11] == ETX))
{
errorCode = ResponseMessage[6]; // meter error. Must be between 0..8
OnMessageEvent("Write " + StructToStr(StName) + "Request Response: " + Tools.BytesToHex(ResponseMessage));
if (errorCode != 0)
{
OnMessageEvent("Write Calibration: Failed with error " + Tools.ByteToHexString(errorCode));
return false;
}
OnMessageEvent("Write : Success");
return true;
}
OnMessageEvent("WriteReq bad device ans");
errorCode = (byte) MCI_ErrorCodes.MCI_Error_Host_WriteReq_bad_device_ans;
return false;
}
public bool MCI_Read(StructName StName, ushort offset, byte payloadlength, int timeoutMs,
out byte[] outBuffer, out byte errorCode)
{
List<byte> RequestMessage = new List<byte>();
byte[] ResponseMessage = null;
byte RxMsgLength;
byte RxMsgId;
byte [] RxOffset = new byte[2];
byte RxPayloadlength;
byte[] RxCrcMeter = new byte[2];
byte[] RxPassword = new byte[2];
byte[] MsgId_Password = MCI_Read_Info[(byte)StName];
byte[] crcValue;
outBuffer = null;
errorCode = (byte)0x00; //Success, No error
if (! IsValidStruct(StName))
{
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_InvalidStructureID_CannotSendMsg;
OnMessageEvent("Read request:" + MCI_Protocol.GetMCIErrorMessage(errorCode));
return false;
}
OnMessageEvent("Read " + StructToStr(StName));
RequestMessage.Add(STX);
RequestMessage.Add(0x06);
RequestMessage.Add(MsgId_Password[0]);
RequestMessage.Add((byte)(offset & 0x00FF));
RequestMessage.Add((byte)((offset & 0xFF00) >> 8));
RequestMessage.Add(payloadlength);
RequestMessage.Add(MsgId_Password[1]);
RequestMessage.Add(MsgId_Password[2]);
crcValue = Crc.calcCRCfromMessage(RequestMessage.ToArray());
RequestMessage.AddRange(crcValue);
RequestMessage.Add(ETX);
OnMessageEvent("Read Request: " + Tools.BytesToHex(RequestMessage.ToArray()));
errorCode = MCI_TxRequest_RxResponse(RequestMessage.ToArray(), out ResponseMessage, timeoutMs);
if (errorCode != (byte) MCI_ErrorCodes.Success_No_error)
{
OnMessageEvent("Read Request:" + MCI_Protocol.GetMCIErrorMessage(errorCode));
return false;
}
if ((ResponseMessage[0] == STX) && (ResponseMessage[11] == ETX)
&& (ResponseMessage[1] == 0x07)
&& (ResponseMessage[2] == RX_ACK_PASSTHROUGH_MSG_ID || ResponseMessage[2] == RX_ACK_RESPONSE_MSG_ID) )
{
//Ack message received, not served the read request
errorCode = ResponseMessage[6]; // forward error message from meter
OnMessageEvent("Read " + StructToStr(StName) + ": Failed with error "
+ Tools.ByteToHexString(errorCode));
return false;
}
//Response message received
RxMsgLength = ResponseMessage[1];
RxMsgId = ResponseMessage[2];
// RxOffset[0] = ResponseMessage[3];
// RxOffset[1] = ResponseMessage[4];
RxPayloadlength = ResponseMessage[5];
// RxPassword[0] = ResponseMessage[6 + RxPayloadlength];
// RxPassword[1] = ResponseMessage[7 + RxPayloadlength];
RxCrcMeter[0] = ResponseMessage[8 + RxPayloadlength];
RxCrcMeter[1] = ResponseMessage[9 + RxPayloadlength];
byte[] RxCrcComputed = Crc.calcCRCfromMessage(ResponseMessage);
OnMessageEvent(Crc.commentCRC(RxCrcMeter, RxCrcComputed));
if (!Crc.crc_do_match(RxCrcMeter, RxCrcComputed))
{
errorCode = (byte) MCI_ErrorCodes.MCI_Error_Host_MeterCRCDoesNotMatch;
return false;
}
//TODO, verify received password matches with expected password or not?
if (!((ResponseMessage[0] == STX) && (ResponseMessage[10 + RxPayloadlength] == ETX)
&& ((ResponseMessage[2] & 0x3F) == (MsgId_Password[0] & 0x3F))))
{
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_ReadReqBadResponseStructure;
return false;
}
outBuffer = new byte[RxPayloadlength];
for (int i = 0; i < RxPayloadlength; i++)
{
outBuffer[i] = (ResponseMessage[6 + i]);
}
OnMessageEvent("Read Request Response: " + Tools.BytesToHex(ResponseMessage));
if (IsValidStruct(StName))
{
OnMessageEvent("Read " + StructToStr(StName) + ": " + Tools.BytesToHex(outBuffer)
+ " Success");
}
else
{
OnMessageEvent("Read Failed! Unknown MCI ID: " + Convert.ToByte(StName));
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_Bad_MCI_ID;
return false;
}
errorCode = (byte)0x00; //Success, No error
return true;
}
private byte MCI_TxRequest_RxResponse(byte[] InBuffer, out byte[] OutBuffer, int timeout)
{
// return message is the errorcode, 0 means no error.
byte[] responseMsg = null;
OutBuffer = null;
MCI_CycleResponseMsgTimeoutFlag = false;
StartReqResCycleTimeoutTimer(timeout);
if (!_ST25DV_Device.ST25DV_ReadMailboxControlReg(out MB_Ctrl_Reg_Value))
{
OnMessageEvent("NFC DLL Error: MB CTRL Reg read (1) failed");
MCI_CycleResponseMsgTimeoutFlag = false;
stopReqResCycleTimeoutTimer();
return (byte) MCI_ErrorCodes.MCI_Error_Host_MB_CTRL_Reg_Read1;
}
//Mailbox enable/disable check, proceed further only if enabled
if ((MB_Ctrl_Reg_Value & 0x01) == 0x00)
{
OnMessageEvent("NFC DLL Error: MB feature (1) disabled");
MCI_CycleResponseMsgTimeoutFlag = false;
stopReqResCycleTimeoutTimer();
return (byte)MCI_ErrorCodes.MCI_Error_Host_MB_disabled1;
}
//Checking iPERL previous message is in mailbox or not, if present then read it and return failure
if ((MB_Ctrl_Reg_Value & 0x02) == 0x02)
{
byte returnError;
OnMessageEvent("NFC DLL Error: Previous message not read, reading now !");
if (!_ST25DV_Device.ST25DV_ReadMailboxMessageLength(out MB_LEN_Dyn_Register))
{
OnMessageEvent("NFC DLL Error: MB LEN Reg read (1) failed");
returnError = (byte)MCI_ErrorCodes.MCI_Error_Host_MB_LEN_Reg_read1;
}
else
{
OnMessageEvent("NFC DLL Error: Previous message length " + MB_LEN_Dyn_Register);
if (!_ST25DV_Device.ST25DV_ReadMessage(MB_LEN_Dyn_Register, out responseMsg))
{
OnMessageEvent("NFC DLL Error: MB message read (1) failed");
returnError = (byte)MCI_ErrorCodes.MCI_Error_Host_MB_msg_read1;
}
else
{
OnMessageEvent("NFC DLL Error: Previous message read as " + Tools.BytesToHex(responseMsg));
OnMessageEvent("NFC DLL Error: Present request not sent, retry again !");
returnError = (byte)MCI_ErrorCodes.MCI_Error_Host_req_not_sent;
}
}
MCI_CycleResponseMsgTimeoutFlag = false;
stopReqResCycleTimeoutTimer();
return returnError;
}
//Checking previous app message is in mailbox or not, if present then return failure !
if ((MB_Ctrl_Reg_Value & 0x04) == 0x04)
{
OnMessageEvent("NFC DLL Error: Previous sent request is not read by iPERL. So, present request will not be sent, retry again !");
MCI_CycleResponseMsgTimeoutFlag = false;
stopReqResCycleTimeoutTimer();
return (byte)MCI_ErrorCodes.MCI_Error_Host_req_not_read_by_iperl;
}
//Mailbox free, so sending request message
if (_ST25DV_Device.ST25DV_WriteMessage(InBuffer))
{
while (true)
{
if (!_ST25DV_Device.ST25DV_ReadMailboxControlReg(out MB_Ctrl_Reg_Value))
{
OnMessageEvent("NFC DLL Error: MB CTRL Reg read (2) failed");
MCI_CycleResponseMsgTimeoutFlag = false;
stopReqResCycleTimeoutTimer();
return (byte)MCI_ErrorCodes.MCI_Error_Host_MB_CTRL_Reg_Read2;
}
//Mailbox enable/disable check, proceed further only if enabled
if ((MB_Ctrl_Reg_Value & 0x01) == 0x00)
{
OnMessageEvent("NFC DLL Error: MB feature (2) disabled");
MCI_CycleResponseMsgTimeoutFlag = false;
stopReqResCycleTimeoutTimer();
return (byte)MCI_ErrorCodes.MCI_Error_Host_MB_disabled2;
}
//Proceed further only if host replied response message, otherwise wait in this loop
if ((MB_Ctrl_Reg_Value & 0x02) == 0x02)
{
if (!_ST25DV_Device.ST25DV_ReadMailboxMessageLength(out MB_LEN_Dyn_Register))
{
OnMessageEvent("NFC DLL Error: MB LEN Reg read (2) failed");
MCI_CycleResponseMsgTimeoutFlag = false;
stopReqResCycleTimeoutTimer();
return (byte)MCI_ErrorCodes.MCI_Error_Host_MB_LEN_Reg_read2;
}
else
{
if (!_ST25DV_Device.ST25DV_ReadMessage(MB_LEN_Dyn_Register, out responseMsg))
{
OnMessageEvent("NFC DLL Error: MB message read (2) failed");
MCI_CycleResponseMsgTimeoutFlag = false;
stopReqResCycleTimeoutTimer();
return (byte)MCI_ErrorCodes.MCI_Error_Host_MB_msg_read2;
}
else
{
OutBuffer = new byte[responseMsg.Length];
OutBuffer = responseMsg;
MCI_CycleResponseMsgTimeoutFlag = false;
stopReqResCycleTimeoutTimer();
return (byte)MCI_ErrorCodes.Success_No_error;
}
}
}
//Checking timeout occured or not
if(MCI_CycleResponseMsgTimeoutFlag)
{
OnMessageEvent("NFC DLL Error: Timeout");
MCI_CycleResponseMsgTimeoutFlag = false;
stopReqResCycleTimeoutTimer();
return (byte)MCI_ErrorCodes.MCI_Error_Host_Timeout;
}
}
}
else
{
OnMessageEvent("NFC DLL Error: MB Msg write failed");
MCI_CycleResponseMsgTimeoutFlag = false;
stopReqResCycleTimeoutTimer();
return (byte)MCI_ErrorCodes.MCI_Error_Host_msg_write;
}
}
#region Message Event
private void OnMessageEvent(string message)
{
NfcMessageEventArgs e = new NfcMessageEventArgs();
e.Message = message;
if (MessageEvent != null)
{
MessageEvent(this, e);
}
e = null;
}
#endregion
private void StartReqResCycleTimeoutTimer(int timeoutMilliSec)
{
_ReqResCycleTimeoutTimer.Elapsed += new ElapsedEventHandler(ReqResCycleTimeoutEvent);
_ReqResCycleTimeoutTimer.Interval = timeoutMilliSec;
_ReqResCycleTimeoutTimer.Enabled = true;
_ReqResCycleTimeoutTimer.Stop();
_ReqResCycleTimeoutTimer.Start();
}
private void stopReqResCycleTimeoutTimer()
{
_ReqResCycleTimeoutTimer.Stop();
}
#region Timer Event
private void ReqResCycleTimeoutEvent(object sender, ElapsedEventArgs e)
{
MCI_CycleResponseMsgTimeoutFlag = true;
}
#endregion
}
}
-655
View File
@@ -1,655 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
//*****************************************************************************
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
// Author: Venkat, Rajeshwar
//*****************************************************************************
namespace Sensus.iPerl.NfcHandler
{
public class NFCHeadConfig
{
private SERIAL_Driver _SERIAL_Driver;
public event DelNfc_NFCHeadConfig_MessageHandler MessageEvent;
private readonly byte NFC_HEAD_CONFIG_MAX_RETRIES = 5;
private readonly byte[] NFCHeadConfig_OK_res_msg = Encoding.ASCII.GetBytes("OK\n"); //'OK\n' - ack - request is implemented successfully
private readonly byte[] NFCHeadConfig_crst_req_msg = Encoding.ASCII.GetBytes("crst\r\n"); //'crst\r\n' - command - reset message
private readonly byte[] NFCHeadConfig_cdoff_req_msg = Encoding.ASCII.GetBytes("cdoff\r\n"); //'cdoff\r\n' - command - data mode off request message
private readonly byte[] NFCHeadConfig_cdon_req_msg = Encoding.ASCII.GetBytes("cdon\r\n"); //'cdon\r\n' - command - data mode on request message
private readonly byte[] NFCHeadConfig_cpon_req_msg = Encoding.ASCII.GetBytes("cpon\r\n"); //'cpon\r\n' - command - pulse output enable command request message
private readonly byte[] NFCHeadConfig_cnfc_req_msg = Encoding.ASCII.GetBytes("cnfc\r\n"); //'cnfc\r\n' - command - nfc interface configure request message
private readonly byte[] NFCHeadConfig_crfid_req_msg = Encoding.ASCII.GetBytes("crfid\r\n"); //'crfid\r\n' - command - rfid interface configure request message
private readonly byte[] NFCHeadConfig_cadc_req_msg = Encoding.ASCII.GetBytes("cadc\r\n"); //'cadc\r\n' - command - adc sampling start request message
private byte[] NFCHeadConfig_gw_write_req_msg = Encoding.ASCII.GetBytes("gw00\r\n"); //'gw00\r\n' - write request - gain write request message. here 00 are hex digits and to be replaced with value to be written
private readonly byte[] NFCHeadConfig_ir_read_req_msg = Encoding.ASCII.GetBytes("ir\r\n"); //'ir\r\n' - read request - interface read request message
private readonly byte[] NFCHeadConfig_ir_read_res_msg_nfc = Encoding.ASCII.GetBytes("INFC\n"); //'INFC\n' - read response - NFC interface read response message
private readonly byte[] NFCHeadConfig_ir_read_res_msg_rfid = Encoding.ASCII.GetBytes("IRFID\n"); //'IRFID\n' - read response - RFID interface read response message
private readonly byte[] NFCHeadConfig_gr_read_req_msg = Encoding.ASCII.GetBytes("gr\r\n"); //'gr\r\n' - read request - gain read request message
private readonly byte[] NFCHeadConfig_gr_read_res_msg = Encoding.ASCII.GetBytes("GR00\n"); //'GR00\n' - read response - gain read response message. here 00 are hex digits
private readonly byte[] NFCHeadConfig_opr_read_req_msg = Encoding.ASCII.GetBytes("opr\r\n"); //'opr\r\n' - read request - opamp output read request message
private readonly byte[] NFCHeadConfig_opr_read_res_msg = Encoding.ASCII.GetBytes("OP0000\n"); //'OP0000\n' - read response - opamp output read response message. here 0000 are hex digits
private readonly byte[] NFCHeadConfig_fr_read_req_msg = Encoding.ASCII.GetBytes("fr\r\n"); //'fr\r\n' - read request - firmware read request message
private readonly byte[] NFCHeadConfig_fr_read_res_msg = Encoding.ASCII.GetBytes("V1.23\n"); //'V1.23\n' - read response - firmware read response message. here 1 is major number and 23 is minor numer
public NFCHeadConfig(SERIAL_Driver serialdriver)
{
_SERIAL_Driver = serialdriver;
}
#region Message Event
private void OnMessageEvent(string message)
{
NfcMessageEventArgs e = new NfcMessageEventArgs();
e.Message = message;
if (MessageEvent != null)
{
MessageEvent(this, e);
}
e = null;
}
#endregion
private byte HexToAscii(byte u8HexDigit)
{
if (u8HexDigit < 10)
{
u8HexDigit += 0x30; //'0' - 0x30
}
else if (u8HexDigit < 16)
{
u8HexDigit -= 10;
u8HexDigit += 0x61; //'a' - 0x61
}
else
{
u8HexDigit = 0xFF;
}
return u8HexDigit;
}
static byte AsciiToHex(byte u8AsciiByte)
{
if (('0' <= u8AsciiByte) && ('9' >= u8AsciiByte))
{
u8AsciiByte -= 0x30; //'0' - 0x30
}
else if (('A' <= u8AsciiByte) && ('F' >= u8AsciiByte))
{
u8AsciiByte -= 0x41; //'A' - 0x41
u8AsciiByte += 0xA;
}
else if (('a' <= u8AsciiByte) && ('f' >= u8AsciiByte))
{
u8AsciiByte -= 0x61; //'a' - 0x61
u8AsciiByte += 0xA;
}
else
{
u8AsciiByte = 0xFF;
}
return u8AsciiByte;
}
public bool NFCHeadConfig_PulseLedOutputEnable()
{
//Switching off data mode or changing to command mode ("cdoff\r\n")
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
{
return false; // true - success, false - failed
}
//Pulse output enable command ("cpon\r\n")
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cpon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
{
return false; // true - success, false - failed
}
return true; // true - success, false - failed
}
public bool NFCHeadConfig_DataLedOutputEnable()
{
//Switching on data mode ("cdon\r\n")
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
{
return false; // true - success, false - failed
}
return true; // true - success, false - failed
}
public ushort NFCHeadConfig_ReadOpampOutput()
{
ushort temp = 0;
byte[] bytesReceived;
int retryCounter = 0;
ushort retVal = 0; // 0 - failed, any other value is Opamp Output
//Switching off data mode (means command mode is on)
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
{
retVal = 0;
OnMessageEvent("NFCHeadConfig_ReadOpampOutput........Failed");
return retVal; // 0 - failed, any other value is Opamp Output
}
//NFC head is in command mode
//Sending command 'cadc\r\n' for starting sampling of OP_OUT
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cadc_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
{
retVal = 0;
OnMessageEvent("NFCHeadConfig_ReadOpampOutput........Failed");
return retVal; // 0 - failed, any other value is Opamp Output
}
OnMessageEvent("NFCHeadConfig_ReadOpampOutput........Start");
while (retryCounter++ <= NFC_HEAD_CONFIG_MAX_RETRIES)
{
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_opr_read_req_msg) + "=0x" + Tools.ByteArrayToHexString(NFCHeadConfig_opr_read_req_msg));
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_opr_read_req_msg));
if (_SERIAL_Driver.SendMessage(NFCHeadConfig_opr_read_req_msg, NFCHeadConfig_opr_read_req_msg.Length))
{
bytesReceived = _SERIAL_Driver.GetRawData();
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
if ((bytesReceived[0] == NFCHeadConfig_opr_read_res_msg[0]) && (bytesReceived[1] == NFCHeadConfig_opr_read_res_msg[1]))
{
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
//'OP' received as first 2 charaters in the response. 3rd to 6th are hex digits of OP_OUT from MSB to LSB respectively
temp = AsciiToHex(bytesReceived[2]);
retVal = (ushort)(temp << 12);
temp = AsciiToHex(bytesReceived[3]);
retVal += (ushort)(temp << 8);
temp = AsciiToHex(bytesReceived[4]);
retVal += (ushort)(temp << 4);
temp = AsciiToHex(bytesReceived[5]);
retVal += temp;
break;
}
else
{
Thread.Sleep(1000);
}
}
else
{
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
Thread.Sleep(1000);
}
}
if (retVal == 0)
{
OnMessageEvent("NFCHeadConfig_ReadOpampOutput........Failed");
}
else
{
OnMessageEvent("NFCHeadConfig_ReadOpampOutput: " + retVal + " ........Success");
}
//Switching data mode on (means command mode is off)
NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES);
return retVal; // 0 - failed, any other value is gain
}
public bool NFCHeadConfig_SetGain(byte gain)
{
byte[] bytesReceived;
int retryCounter = 0;
bool bRetVal = false;
//Switching off data mode (means command mode is on)
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
{
bRetVal = false;
OnMessageEvent("NFCHeadConfig_SetGain........Failed");
return bRetVal; // true - success, false - failed
}
OnMessageEvent("NFCHeadConfig_SetGain........Start");
NFCHeadConfig_gw_write_req_msg[2] = HexToAscii((byte)((gain & 0xF0) >> 4)); //Higher nibble of gain
NFCHeadConfig_gw_write_req_msg[3] = HexToAscii((byte)(gain & 0x0F)); //Lower nibble of gain
while (retryCounter++ <= NFC_HEAD_CONFIG_MAX_RETRIES)
{
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_gw_write_req_msg) + "=0x" + Tools.ByteArrayToHexString(NFCHeadConfig_gw_write_req_msg));
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_gw_write_req_msg));
if (_SERIAL_Driver.SendMessage(NFCHeadConfig_gw_write_req_msg, NFCHeadConfig_gw_write_req_msg.Length))
{
bytesReceived = _SERIAL_Driver.GetRawData();
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
if ((bytesReceived[0] == NFCHeadConfig_OK_res_msg[0]) && (bytesReceived[1] == NFCHeadConfig_OK_res_msg[1])
&& (bytesReceived[2] == NFCHeadConfig_OK_res_msg[2]))
{
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
//'OK\n' received
bRetVal = true;
break;
}
else
{
Thread.Sleep(1000);
}
}
else
{
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
Thread.Sleep(1000);
}
}
if (bRetVal)
{
OnMessageEvent("NFCHeadConfig_SetGain........Success");
}
else
{
OnMessageEvent("NFCHeadConfig_SetGain........Failed");
}
//Switching data mode on (means command mode is off)
NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES);
return bRetVal;
}
public byte NFCHeadConfig_ReadGain()
{
byte temp = 0;
byte[] bytesReceived;
int retryCounter = 0;
byte retVal = 0; // 0 - failed, any other value is gain
//Switching off data mode (means command mode is on)
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
{
retVal = 0;
OnMessageEvent("NFCHeadConfig_ReadGain........Failed");
return retVal; // 0 - failed, any other value is gain
}
OnMessageEvent("NFCHeadConfig_ReadGain........Start");
//NFC head is in command mode
while (retryCounter++ <= NFC_HEAD_CONFIG_MAX_RETRIES)
{
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_gr_read_req_msg) + "=0x" + Tools.ByteArrayToHexString(NFCHeadConfig_gr_read_req_msg));
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_gr_read_req_msg));
if (_SERIAL_Driver.SendMessage(NFCHeadConfig_gr_read_req_msg, NFCHeadConfig_gr_read_req_msg.Length))
{
bytesReceived = _SERIAL_Driver.GetRawData();
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
if ((bytesReceived[0] == NFCHeadConfig_gr_read_res_msg[0]) && (bytesReceived[1] == NFCHeadConfig_gr_read_res_msg[1])
&& (bytesReceived[4] == NFCHeadConfig_gr_read_res_msg[4]))
{
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
//'GR' received as first 2 charaters in the response. 3rd and 4th are gain as hex digits
temp = AsciiToHex(bytesReceived[2]);
retVal = (byte)(temp << 4);
temp = AsciiToHex(bytesReceived[3]);
retVal += temp; // 0 - failed, any other value is gain
break;
}
else
{
Thread.Sleep(1000);
}
}
else
{
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
Thread.Sleep(1000);
}
}
if (retVal == 0)
{
OnMessageEvent("NFCHeadConfig_ReadGain........Failed");
}
else
{
OnMessageEvent("NFCHeadConfig_ReadGain: " + retVal + " ........Success");
}
//Switching data mode on (means command mode is off)
NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES);
return retVal; // 0 - failed, any other value is gain
}
public bool NFCHeadConfig_SetInterface(bool value)
{
byte[] bytesTransmit;
byte[] bytesReceived;
int retryCounter = 0;
bool bRetVal = false;
//Switching off data mode (means command mode is on)
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
{
bRetVal = false;
OnMessageEvent("NFCHeadConfig_SetInterface........Failed");
return bRetVal; // true - success, false - failed
}
//NFC head is in command mode
if (value) //true - NFC, false - RFID
{
bytesTransmit = NFCHeadConfig_cnfc_req_msg;
OnMessageEvent("NFCHeadConfig_SetInterface: NFC........Start");
}
else
{
bytesTransmit = NFCHeadConfig_crfid_req_msg;
OnMessageEvent("NFCHeadConfig_SetInterface: RFID........Start");
}
while (retryCounter++ <= NFC_HEAD_CONFIG_MAX_RETRIES)
{
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(bytesTransmit) + "=0x" + Tools.ByteArrayToHexString(bytesTransmit));
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(bytesTransmit));
if (_SERIAL_Driver.SendMessage(bytesTransmit, bytesTransmit.Length))
{
bytesReceived = _SERIAL_Driver.GetRawData();
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
if ((bytesReceived[0] == NFCHeadConfig_OK_res_msg[0]) && (bytesReceived[1] == NFCHeadConfig_OK_res_msg[1])
&& (bytesReceived[2] == NFCHeadConfig_OK_res_msg[2]))
{
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
//'OK\n' received
bRetVal = true;
break;
}
else
{
Thread.Sleep(1000);
}
}
else
{
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
Thread.Sleep(1000);
}
}
if (bRetVal)
{
OnMessageEvent("NFCHeadConfig_SetInterface........Success");
}
else
{
OnMessageEvent("NFCHeadConfig_SetInterface........Failed");
}
//Switching data mode on (means command mode is off)
NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES);
return bRetVal;
}
public byte NFCHeadConfig_ReadInterface()
{
byte[] bytesReceived;
int retryCounter = 0;
byte retVal = 0; // 0 - failed, 1 - NFC, 2 - RFID
//Switching off data mode (means command mode is on)
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
{
retVal = 0;
OnMessageEvent("NFCHeadConfig_ReadInterface........Failed");
return retVal; // 0 - failed, any other value is gain
}
OnMessageEvent("NFCHeadConfig_ReadInterface........Start");
//NFC head is in command mode
while (retryCounter++ < NFC_HEAD_CONFIG_MAX_RETRIES)
{
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_ir_read_req_msg) + "=0x" + Tools.ByteArrayToHexString(NFCHeadConfig_ir_read_req_msg));
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_ir_read_req_msg));
if (_SERIAL_Driver.SendMessage(NFCHeadConfig_ir_read_req_msg, NFCHeadConfig_ir_read_req_msg.Length))
{
bytesReceived = _SERIAL_Driver.GetRawData();
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
if ((bytesReceived[0] == NFCHeadConfig_ir_read_res_msg_nfc[0]) && (bytesReceived[1] == NFCHeadConfig_ir_read_res_msg_nfc[1])
&& (bytesReceived[2] == NFCHeadConfig_ir_read_res_msg_nfc[2]) && (bytesReceived[3] == NFCHeadConfig_ir_read_res_msg_nfc[3]))
{
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
retVal = 1; // 0 - failed, 1 - NFC, 2 - RFID
break;
}
else if ((bytesReceived[0] == NFCHeadConfig_ir_read_res_msg_rfid[0]) && (bytesReceived[1] == NFCHeadConfig_ir_read_res_msg_rfid[1])
&& (bytesReceived[2] == NFCHeadConfig_ir_read_res_msg_rfid[2]) && (bytesReceived[3] == NFCHeadConfig_ir_read_res_msg_rfid[3])
&& (bytesReceived[4] == NFCHeadConfig_ir_read_res_msg_rfid[4]))
{
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
retVal = 2; // 0 - failed, 1 - NFC, 2 - RFID
break;
}
else
{
Thread.Sleep(1000);
}
}
else
{
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
Thread.Sleep(1000);
}
}
if (retVal == 0)
{
OnMessageEvent("NFCHeadConfig_ReadInterface........Failed");
}
else if (retVal == 1)
{
OnMessageEvent("NFCHeadConfig_ReadInterface: NFC ........Success");
}
else if (retVal == 2)
{
OnMessageEvent("NFCHeadConfig_ReadInterface: RFID ........Success");
}
//Switching data mode on (means command mode is off)
NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES);
return retVal; // 0 - failed, 1 - NFC, 2 - RFID
}
public byte[] NFCHeadConfig_ReadFirmwareVersion()
{
byte[] bytesReceived = { 0 };
int retryCounter = 0;
//Switching off data mode (means command mode is on)
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
{
OnMessageEvent("NFCHeadConfig_ReadFirmwareVersion........Failed");
return bytesReceived; // 0 - failed
}
OnMessageEvent("NFCHeadConfig_ReadFirmwareVersion........Start");
//NFC head is in command mode
while (retryCounter++ <= NFC_HEAD_CONFIG_MAX_RETRIES)
{
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_fr_read_req_msg) + "=0x" + Tools.ByteArrayToHexString(NFCHeadConfig_fr_read_req_msg));
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_fr_read_req_msg));
if (_SERIAL_Driver.SendMessage(NFCHeadConfig_fr_read_req_msg, NFCHeadConfig_fr_read_req_msg.Length))
{
bytesReceived = _SERIAL_Driver.GetRawData();
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
if (bytesReceived[0] == NFCHeadConfig_fr_read_res_msg[0])
{
//'V' is received as first character in the response. So, the firmware version string is followed and ended with '\n'
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
break;
}
else
{
Thread.Sleep(1000);
}
}
else
{
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
Thread.Sleep(1000);
}
}
if (bytesReceived[0] == 0)
{
OnMessageEvent("NFCHeadConfig_ReadFirmwareVersion........Failed");
}
else
{
OnMessageEvent("NFCHeadConfig_ReadFirmwareVersion........Success");
}
//Switching data mode on (means command mode is off)
NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES);
return bytesReceived; // 0 - failed, any other value is firmware version
}
private bool NFCHeadConfig_cmd_tx(byte[] requestTxMessage, int retries)
{
byte[] bytesReceived;
int retryCounter = 0;
bool bRetVal = false;
if (requestTxMessage == NFCHeadConfig_cpon_req_msg)
{
OnMessageEvent("NFCHeadConfig_cpon........Start");
}
else if (requestTxMessage == NFCHeadConfig_cdoff_req_msg)
{
OnMessageEvent("NFCHeadConfig_cdoff........Start");
}
else if (requestTxMessage == NFCHeadConfig_cdon_req_msg)
{
OnMessageEvent("NFCHeadConfig_cdon........Start");
}
else if (requestTxMessage == NFCHeadConfig_cnfc_req_msg)
{
OnMessageEvent("NFCHeadConfig_cnfc........Start");
}
else if (requestTxMessage == NFCHeadConfig_crfid_req_msg)
{
OnMessageEvent("NFCHeadConfig_crfid........Start");
}
else if (requestTxMessage == NFCHeadConfig_cadc_req_msg)
{
OnMessageEvent("NFCHeadConfig_cadc........Start");
}
else if (requestTxMessage == NFCHeadConfig_crst_req_msg)
{
OnMessageEvent("NFCHeadConfig_crst........Start");
}
else
{
OnMessageEvent("NFCHeadConfig_cmd_tx: unidentified command........Failed");
bRetVal = false;
return bRetVal;
}
while (++retryCounter <= retries)
{
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(requestTxMessage) + "=0x" + Tools.ByteArrayToHexString(requestTxMessage));
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(requestTxMessage));
if (_SERIAL_Driver.SendMessage(requestTxMessage, requestTxMessage.Length))
{
bytesReceived = _SERIAL_Driver.GetRawData();
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
if ((bytesReceived[0] == NFCHeadConfig_OK_res_msg[0]) && (bytesReceived[1] == NFCHeadConfig_OK_res_msg[1])
&& (bytesReceived[2] == NFCHeadConfig_OK_res_msg[2]))
{
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(NFCHeadConfig_OK_res_msg));
//'OK\n' received
bRetVal = true;
break;
}
else
{
Thread.Sleep(1000);
}
}
else
{
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
Thread.Sleep(1000);
}
}
if (bRetVal == true)
{
if (requestTxMessage == NFCHeadConfig_cpon_req_msg)
{
OnMessageEvent("NFCHeadConfig_cpon........Success");
}
else if (requestTxMessage == NFCHeadConfig_cdoff_req_msg)
{
OnMessageEvent("NFCHeadConfig_cdoff........Success");
}
else if (requestTxMessage == NFCHeadConfig_cdon_req_msg)
{
OnMessageEvent("NFCHeadConfig_cdon........Success");
}
else if (requestTxMessage == NFCHeadConfig_cnfc_req_msg)
{
OnMessageEvent("NFCHeadConfig_cnfc........Success");
}
else if (requestTxMessage == NFCHeadConfig_crfid_req_msg)
{
OnMessageEvent("NFCHeadConfig_crfid........Success");
}
else if (requestTxMessage == NFCHeadConfig_cadc_req_msg)
{
OnMessageEvent("NFCHeadConfig_cadc........Success");
}
else if (requestTxMessage == NFCHeadConfig_crst_req_msg)
{
OnMessageEvent("NFCHeadConfig_crst........Success");
}
}
else
{
if (requestTxMessage == NFCHeadConfig_cpon_req_msg)
{
OnMessageEvent("NFCHeadConfig_cpon........Failed");
}
else if (requestTxMessage == NFCHeadConfig_cdoff_req_msg)
{
OnMessageEvent("NFCHeadConfig_cdoff........Failed");
}
else if (requestTxMessage == NFCHeadConfig_cdon_req_msg)
{
OnMessageEvent("NFCHeadConfig_cdon........Failed");
}
else if (requestTxMessage == NFCHeadConfig_cnfc_req_msg)
{
OnMessageEvent("NFCHeadConfig_cnfc........Failed");
}
else if (requestTxMessage == NFCHeadConfig_crfid_req_msg)
{
OnMessageEvent("NFCHeadConfig_crfid........Failed");
}
else if (requestTxMessage == NFCHeadConfig_cadc_req_msg)
{
OnMessageEvent("NFCHeadConfig_cadc........Failed");
}
else if (requestTxMessage == NFCHeadConfig_crst_req_msg)
{
OnMessageEvent("NFCHeadConfig_crst........Failed");
}
}
return bRetVal;
}
}
}
-561
View File
@@ -1,561 +0,0 @@
using System;
using System.IO.Ports;
using System.Diagnostics;
//*****************************************************************************
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
// Author: Venkat, Rajeshwar
//*****************************************************************************
namespace Sensus.iPerl.NfcHandler
{
public sealed class NfcDataHandler
{
public SERIAL_Driver _SERIAL_Driver;
public SERIAL_Driver _SERIAL_Driver_Head_Config;
public CR95HF_Reader _CR95HF_Reader;
public ST25DV_Device _ST25DV_Device;
public MCI_Protocol _MCI_Protocol;
public NFCHeadConfig _NFCHead_Config;
public byte LastErrorCode { get; set; }
public string LastErrorMessage { get; set; }
public byte[] LastData { get; set; }
public event DelNfcMessageHandler MessageEvent;
private string _ComPort = "";
public NfcDataHandler()
{
_SERIAL_Driver = new SERIAL_Driver();
_SERIAL_Driver_Head_Config = new SERIAL_Driver();
_CR95HF_Reader = new CR95HF_Reader(_SERIAL_Driver);
_ST25DV_Device = new ST25DV_Device(_CR95HF_Reader);
_MCI_Protocol = new MCI_Protocol(_ST25DV_Device);
_NFCHead_Config = new NFCHeadConfig(_SERIAL_Driver_Head_Config);
LastErrorCode = 0;
}
public bool OpenConnection(string comport, int baudrate, int databits, Parity parity, StopBits stopbits)
{
_ComPort = comport;
bool isopen = _SERIAL_Driver.OpenConnection(comport, baudrate, databits, parity, stopbits);
if(!isopen)OnMessageEvent(_SERIAL_Driver.ErrorMessage);
return isopen;
}
public bool isOpen()
{
return _SERIAL_Driver.isOpen();
}
public void Close()
{
_SERIAL_Driver.Close();
_SERIAL_Driver.Dispose();
}
public bool OpenConnectionSTM(string comport)
{
// helper for lazy people who don't know the comport settings or don't have
// parameters of type 'Parity' or 'StopBits' in their language (Python) at hand
// used here: https://slm.sms-esaap.com/iPERL/tetoo/-/tree/dev/tetoo/nfcs5_dll_wrapper
return OpenConnection(comport, 57600, 8, Parity.None, StopBits.Two);
}
public bool NFCHead_OpenConnection(string comport)
{
if (isOpen() && _ComPort == comport)
{
OnMessageEvent(comport + "......... Already in use ");
return false;
}
bool isopen = _SERIAL_Driver_Head_Config.OpenConnection(comport, 9600, 8, Parity.None, StopBits.Two);
OnMessageEvent(_SERIAL_Driver_Head_Config.ErrorMessage);
return isopen;
}
public bool isNFCHeadOpen()
{
return _SERIAL_Driver_Head_Config.isOpen();
}
public void NFCHeadClose()
{
if (_SERIAL_Driver_Head_Config.isOpen())
{
_SERIAL_Driver_Head_Config.Close();
_SERIAL_Driver_Head_Config.Dispose();
}
}
public bool ConnectReader()
{
if (_CR95HF_Reader.CR95HF_Connect())
{
OnMessageEvent("CombiHead.......Connected");
return true;
}
else
{
OnMessageEvent("CombiHead.......Not connected");
return false;
}
}
public bool RFProtocolON()
{
if (_CR95HF_Reader.CR95HF_RFProtocolOn())
{
OnMessageEvent("NFC CR95HF RF Protocol ON........Success");
return true;
}
else
{
OnMessageEvent("NFC CR95HF RF Protocol ON........Failed");
return false;
}
}
public bool RFProtocolOFF()
{
if (_CR95HF_Reader.CR95HF_RFProtocolOff())
{
OnMessageEvent("NFC CR95HF RF Protocol OFF........Success");
return true;
}
else
{
OnMessageEvent("NFC CR95HF RF Protocol OFF........Failed");
return false;
}
}
public bool ConnectDevice()
{
byte[] responseData;
if (_CR95HF_Reader.CR95HF_RFProtocolOn())
{
if (GetSystemInfo())
{
responseData = LastData;
if (responseData[0] == 0x0F)
OnMessageEvent("Device -> ST25DV04K");
else
OnMessageEvent("Device -> ST25DV16K or 64K");
OnMessageEvent("UID -> " + Tools.ByteToHexString(responseData[1]) + " " + Tools.ByteToHexString(responseData[2]) + " " + Tools.ByteToHexString(responseData[3]) + " " + Tools.ByteToHexString(responseData[4]) +
" " + Tools.ByteToHexString(responseData[5]) + " " + Tools.ByteToHexString(responseData[6]) + " " + Tools.ByteToHexString(responseData[7]) + " " + Tools.ByteToHexString(responseData[8]));
//OnMessageEvent("DSFID -> " + Tools.ByteToHexString(responseData[9]));
//OnMessageEvent("AFI -> " + Tools.ByteToHexString(responseData[10]));
//OnMessageEvent("Block size -> " + Tools.ByteToHexString(responseData[11]));
//OnMessageEvent("Memory size -> " + Tools.ByteToHexString(responseData[12]));
//if (responseData[13] == 0x24)
// OnMessageEvent("IC Ref -> ST25DV04K");
//else
// OnMessageEvent("IC Ref -> ST25DV16K or 64K");
OnMessageEvent("iPERL.......Connected");
return true;
}
else
{
OnMessageEvent("iPERL.......Not connected");
}
}
return false;
}
public bool GetSystemInfo()
{
byte[] responseData = null;
try
{
if (_ST25DV_Device.ST25DV_GetSystemInfo(out responseData))
{
LastData = responseData;
return true;
}
}
catch (Exception ex)
{
OnMessageEvent(ex.Message);
}
return false;
}
public bool ST25DV_ReadSingleBlock(byte blockNumber, out byte[] outBuffer)
{
return _ST25DV_Device.ST25DV_ReadSingleBlock(blockNumber, out outBuffer);
}
public bool ST25DV_WriteSingleBlock(byte blockNumber, byte[] inBuffer)
{
return _ST25DV_Device.ST25DV_WriteSingleBlock(blockNumber, inBuffer);
}
public bool ST25DV_ReadMultipleBlocks(byte startingBlockNumber, byte numberOfBlocks, out byte[] OutBuffer)
{
return _ST25DV_Device.ST25DV_ReadMultipleBlocks(startingBlockNumber, numberOfBlocks, out OutBuffer);
}
public bool Echo()
{
if (!_CR95HF_Reader.CR95HF_Echo())
{
OnMessageEvent("Echo..Failed. CombiHead connection...Lost");
return false;
}
return true;
}
public bool ST25DV_ReadConfiguration(byte pointer, out byte value)
{
return _ST25DV_Device.ST25DV_ReadConfiguration(pointer, out value, true);
}
public bool ST25DV_ReadDynamicConfiguration(byte regAddress, out byte OutBuffer)
{
return _ST25DV_Device.ST25DV_ReadDynamicConfiguration(regAddress, out OutBuffer, true);
}
public bool ST25DV_WriteDynamicConfiguration(byte regAddress, byte regValue)
{
return _ST25DV_Device.ST25DV_WriteDynamicConfiguration(regAddress, regValue, true);
}
public bool ST25DV_ReadMailboxMessageLength(out byte MessageLength)
{
return _ST25DV_Device.ST25DV_ReadMailboxMessageLength(out MessageLength, true);
}
// This function-header is needed for calls to the DLL without need for using enums.
// In python 3.11 the module pythonnet (v3.x) does not support casting 'int' to 'enum' aynmore,
// so this workaround is needed.
public bool MCI_Read_pythonwrapper_enum(int STIndex, ushort offset, byte payloadlength, int timeoutMs)
{
return MCI_Read((MCI_Protocol.StructName)STIndex, offset, payloadlength, timeoutMs);
}
public bool MCI_Read(MCI_Protocol.StructName StName, ushort offset, byte payloadlength, int timeoutMs)
{
LastErrorMessage = string.Empty;
byte[] response;
byte errorCode = 0;
if (ST25DV_MailboxCommStart())
{
bool worked = _MCI_Protocol.MCI_Read(StName, offset, payloadlength, timeoutMs, out response, out errorCode);
LastErrorCode = errorCode;
LastData = response;
if (!worked)
{
SetLastErrorMesage();
ST25DV_MailboxCommStop();
return false;
}
return ST25DV_MailboxCommStop();
}
return false;
}
// This function-header is needed for calls to the DLL without need for using enums.
// In python 3.11 the module pythonnet (v3.x) does not support casting 'int' to 'enum' aynmore,
// so this workaround is needed.
public bool MCI_Write_pythonwrapper_enum(int STIndex, ushort offset, byte payloadlength, byte[] payload, int timeoutMs)
{
return MCI_Write((MCI_Protocol.StructName)STIndex, offset, payloadlength, payload, timeoutMs);
}
public bool MCI_Write(MCI_Protocol.StructName StName, ushort offset, byte payloadlength, byte[] payload, int timeoutMs)
{
LastErrorMessage = string.Empty;
LastData = null;
byte errorCode = 0;
if (ST25DV_MailboxCommStart())
{
bool ans = _MCI_Protocol.MCI_Write(StName, offset, payloadlength, payload, timeoutMs, out errorCode);
LastErrorCode = errorCode;
if (!ans)
{
SetLastErrorMesage();
ST25DV_MailboxCommStop();
return false;
}
return ST25DV_MailboxCommStop();
}
return false;
}
public bool MCI_Read(byte msgId, ushort offset, byte payloadlength, int timeoutMs)
{
LastErrorMessage = string.Empty;
byte[] response;
byte errorCode = 0;
if (ST25DV_MailboxCommStart())
{
bool ans = _MCI_Protocol.MCI_Read((MCI_Protocol.StructName) msgId, offset, payloadlength, timeoutMs,
out response, out errorCode);
LastErrorCode = errorCode;
LastData = response;
if (!ans)
{
SetLastErrorMesage();
ST25DV_MailboxCommStop();
return false;
}
return ST25DV_MailboxCommStop();
}
return false;
}
public bool MCI_Write(byte msgId, ushort offset, byte payloadlength, byte[] payload, int timeoutMs)
{
LastErrorMessage = string.Empty;
LastData = null;
byte errorCode = 0;
if (ST25DV_MailboxCommStart())
{
bool ans = _MCI_Protocol.MCI_Write((MCI_Protocol.StructName) msgId, offset, payloadlength, payload,
timeoutMs, out errorCode);
LastErrorCode = errorCode;
if (!ans)
{
SetLastErrorMesage();
ST25DV_MailboxCommStop();
return false;
}
return ST25DV_MailboxCommStop();
}
return false;
}
private bool ST25DV_MailboxCommStart()
{
bool success = false;
byte[] EepromBlockRead = { 0, 0, 0, 0 };
byte[] EepromBlockWrite = { 0, 0, 0, 0 };
//Byte-2 in block-2 represent the EEPROM I2C interface status ->
//0xA5-EEPROM I2C Interface Idle, 0x5A-EEPROM I2C Interface Active
success = _ST25DV_Device.ST25DV_ReadSingleBlock(2, out EepromBlockRead, false);
if (success)
{
if (EepromBlockRead[1] == 0xA5) //0xA5-EEPROM I2C Interface Idle
{
//Byte-1 in block-64 represent the Mailbox RF interface status ->
//0xA5-Mailbox RF Interface Idle, 0x5A-Mailbox RF Interface Active
EepromBlockWrite[0] = 0x5A; //Raising Mailbox RF interface Active flag to avoid collisions with host interface
success = _ST25DV_Device.ST25DV_WriteSingleBlock(64, EepromBlockWrite, false);
if (success)
{
//Sets 0x01 (MB_EN) in the register (MB_CTRL_Dyn) with address 0x0D
if (_ST25DV_Device.ST25DV_WriteDynamicConfiguration(0x0D, 0x01, false))
{
return true; //With this we proceed for mailbox communication with ST25
}
else
{
LastErrorCode = 0x08; //MCI Error: Unidentified
LastErrorMessage = "MB_CTRL_Dyn writing failed(ST25DV_MailboxCommStart), try again";
return false;
}
}
else
{
LastErrorCode = 0x08; //MCI Error: Unidentified
LastErrorMessage = "Mailbox RF interface status writing failed(ST25DV_MailboxCommStart), try again";
return false;
}
}
else
{
LastErrorCode = 0x08; //MCI Error: Unidentified
LastErrorMessage = "EEPROM interface busy(ST25DV_MailboxCommStart), try again";
return false;
}
}
else
{
LastErrorCode = 0x08; //MCI Error: Unidentified
LastErrorMessage = "EEPROM interface status reading failed(ST25DV_MailboxCommStart), try again";
return false;
}
}
private bool ST25DV_MailboxCommStop()
{
bool success = false;
byte[] EepromBlockWrite = { 0, 0, 0, 0 };
//Sets 0x00 (MB_EN) in the register (MB_CTRL_Dyn) with address 0x0D
if (_ST25DV_Device.ST25DV_WriteDynamicConfiguration(0x0D, 0x00, false))
{
//Byte-1 in block-64 represent the Mailbox RF interface status ->
//0xA5-Mailbox RF Interface Idle, 0x5A-Mailbox RF Interface Active
EepromBlockWrite[0] = 0xA5; //Raising Mailbox RF interface Idle flag to avoid collisions with host interface
success = _ST25DV_Device.ST25DV_WriteSingleBlock(64, EepromBlockWrite, false);
if (success)
{
return true; //With this we proceed for interpreting the communication happened with ST25
}
else
{
LastErrorCode = 0x08; //MCI Error: Unidentified
LastErrorMessage = "Mailbox RF interface status writing failed(ST25DV_MailboxCommStop), try again";
return false;
}
}
else
{
LastErrorCode = 0x08; //MCI Error: Unidentified
LastErrorMessage = "MB_CTRL_Dyn writing failed(ST25DV_MailboxCommStop), try again";
return false;
}
}
private void SetLastErrorMesage()
{
try
{
LastErrorMessage = MCI_Protocol.GetMCIErrorMessage(LastErrorCode);
}
catch
{
LastErrorMessage = "MCI Error: The Errorcode '" + LastErrorCode as string +
"' couldn't be converted to string with the enum MCI_ErrorCodes!";
}
}
public bool NFCHeadConfig_PulseLedOutputEnable()
{
return _NFCHead_Config.NFCHeadConfig_PulseLedOutputEnable(); // true - success, false - failed
}
public bool NFCHeadConfig_DataLedOutputEnable()
{
return _NFCHead_Config.NFCHeadConfig_DataLedOutputEnable(); // true - success, false - failed
}
public ushort NFCHeadConfig_ReadOpampOutput()
{
return _NFCHead_Config.NFCHeadConfig_ReadOpampOutput(); // 0 - failed, any other value is opamp output
}
public bool NFCHeadConfig_SetGain(byte gain)
{
return _NFCHead_Config.NFCHeadConfig_SetGain(gain); // true - success, false - failed
}
public byte NFCHeadConfig_ReadGain()
{
return _NFCHead_Config.NFCHeadConfig_ReadGain(); // 0 - failed, any other value is gain
}
public bool NFCHeadConfig_SetInterface(bool value)
{
return _NFCHead_Config.NFCHeadConfig_SetInterface(value); // true - success, false - failed
}
public byte NFCHeadConfig_ReadInterface()
{
return _NFCHead_Config.NFCHeadConfig_ReadInterface(); // 0 - failed, 1 - NFC, 2 - RFID
}
public byte[] NFCHeadConfig_ReadFirmwareVersion()
{
return _NFCHead_Config.NFCHeadConfig_ReadFirmwareVersion(); // 0 - failed, any other value is firmware version
}
public bool NFCSecurity_SendSignedCommand(byte[] payload, int timeoutMs)
{
byte payloadLength = Convert.ToByte(payload.Length);
ushort offset = 0;
try
{
if ( (!MCI_Write(MCI_Protocol.StructName.NfcSecurity, offset, payloadLength, payload, timeoutMs)) || (LastErrorCode != 0x00))
{
return false;
}
}
catch (Exception ex)
{
OnMessageEvent(ex.Message);
}
return true; // true - success, false - failed
}
public byte NFCSecurity_ReadPrivilegeLevel(int timeoutMs)
{
ushort offset = 0;
byte payloadLength = 1;
byte payload = 4;
try
{
if ((!MCI_Read(MCI_Protocol.StructName.NfcSecurity, offset, payloadLength, timeoutMs)) || (LastErrorCode != 0x00))
{
payload = 4;
}
else
{
payload = LastData[0];
}
}
catch (Exception ex)
{
OnMessageEvent(ex.Message);
}
return payload; // 0 - No Security, 1 - Customer Maintenance, 2 - Customer Admin, 3 - Sensus Admin, 4 and above - failed
}
public bool NFCSecurity_ClearPrivilegeLevel(int timeoutMs)
{
ushort offset = 0;
byte payloadLength = 1;
byte [] payload = { 0x23 }; // 0x23 - Command code for 'NFC Security reset access level'
try
{
if ((!MCI_Write(MCI_Protocol.StructName.Command, offset, payloadLength, payload, timeoutMs)) || (LastErrorCode != 0x00))
{
return false;
}
}
catch (Exception ex)
{
OnMessageEvent(ex.Message);
}
return true; // true - success, false - failed
}
public string GetDllVersion()
{
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
string str = "NfcS5 DLL v" + fvi.FileVersion;
return str.Remove(str.Length - 2); // only show x.y.z version, hide 4th number
}
#region Message Event
private void OnMessageEvent(string message)
{
NfcMessageEventArgs e = new NfcMessageEventArgs();
e.Message = message;
if (MessageEvent != null)
{
MessageEvent(this, e);
}
e = null;
}
#endregion
}
}
-23
View File
@@ -1,23 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//*****************************************************************************
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
// Author: Venkat, Rajeshwar
//*****************************************************************************
namespace Sensus.iPerl.NfcHandler
{
public delegate void DelNfcMessageHandler(object sender, NfcMessageEventArgs e);
public delegate void DelNfc_ST25DV_MessageHandler(object sender, NfcMessageEventArgs e);
public delegate void DelNfc_CR95HF_MessageHandler(object sender, NfcMessageEventArgs e);
public delegate void DelNfc_MCI_MessageHandler(object sender, NfcMessageEventArgs e);
public delegate void DelNfc_NFCHeadConfig_MessageHandler(object sender, NfcMessageEventArgs e);
public class NfcMessageEventArgs
{
public string Message;
}
}
-155
View File
@@ -1,155 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using System.Threading;
using System.Diagnostics;
using System.Collections.ObjectModel;
//*****************************************************************************
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
// Author: Venkat, Rajeshwar
//*****************************************************************************
namespace Sensus.iPerl.NfcHandler
{
public class SERIAL_Driver
{
public string ErrorMessage { get; private set; }
public Collection<byte> SerialPortReadBuffer = new Collection<byte>();
private SerialPort _serialPort;
private List<byte[]> _binMessages = new List<byte[]>();
private bool _isReading;
private Parity Parity { get; set; }
private StopBits StopBits { get; set; }
public SERIAL_Driver()
{
_serialPort = new SerialPort();
}
public bool OpenConnection(string comPort, int baudrate, int dataBits, Parity parity, StopBits stopbits, int readTimeout=1000, int writeTimeout = 1000)
{
lock (this)
{
if ((_serialPort != null) && (_serialPort.IsOpen))
{
_serialPort.DataReceived -= DataReceivedHandler;
_serialPort.Close();
_serialPort.Dispose();
_serialPort = null;
}
try
{
ErrorMessage = "";
//_serialPort = new SerialPort(comPort, 57600, Parity.None, 8, StopBits.Two);
_serialPort = new SerialPort(comPort, baudrate, parity, dataBits, stopbits);
_serialPort.ReadTimeout = readTimeout;
_serialPort.WriteTimeout = writeTimeout;
_serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
_serialPort.Open();
}
catch (Exception ex)
{
ErrorMessage = String.Format("COM error: Open failed {0}.{1}", comPort, ex.Message);
return false;
}
if (!_serialPort.IsOpen)
{
ErrorMessage = String.Format("COM error: Can't Open {0}.", comPort);
return false;
}
}//End Lock
return true;
}
public bool SendMessage(byte[] sendDataBytes, int length, int readTimeout = 1000, int writeTimeout=1000)
{
if (!isOpen()) return false;
if (sendDataBytes.Length == 0) return true; // nothing to send - no error
try
{
PrepareReading(); //clear read buffer etc.
_serialPort.WriteTimeout = writeTimeout;
_serialPort.ReadTimeout = readTimeout;
_serialPort.Write(sendDataBytes, 0, length);
_isReading = true;
Thread.Sleep(100);
var stopWatch = Stopwatch.StartNew(); //start stop watch for data recevie timeout
while (_isReading) //wait until reading finishes or timeout occur
{
if (stopWatch.ElapsedMilliseconds > readTimeout)
{
stopWatch.Stop();
ErrorMessage = "COM error: Receive timeout";
return false;
}
}
}
catch (Exception ex)
{
ErrorMessage = String.Format("COM error: Transmit timeout {0}.{1}", _serialPort.PortName, ex.Message);
return false; // Exception in send function
}
return true;
}
private void PrepareReading()
{
_serialPort.DiscardInBuffer();
if(_binMessages != null) _binMessages.Clear();
_isReading = true;
}
public byte[] GetRawData()
{
try
{
return _binMessages[0].ToArray();
}
catch(Exception)
{
byte[] err = { 0xFF };
return err;
}
}
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
if (!_serialPort.IsOpen) return;
lock (this)
{
Thread.Sleep(100);
SerialPortReadBuffer = new Collection<byte>();
while (_serialPort.BytesToRead > 0)
{
SerialPortReadBuffer.Add((byte)_serialPort.ReadByte());
}
_binMessages.Add(SerialPortReadBuffer.ToArray());
_isReading = false;
}
}
public void Close()
{
if (isOpen())
{
_serialPort.Close();
}
}
public void Dispose()
{
if (_serialPort != null)
{
_serialPort.Dispose();
}
}
public bool isOpen()
{
if(_serialPort != null)
return _serialPort.IsOpen;
return false;
}
}
}
-410
View File
@@ -1,410 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//*****************************************************************************
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
// Author: Venkat, Rajeshwar
//*****************************************************************************
namespace Sensus.iPerl.NfcHandler
{
public class ST25DV_Device
{
private readonly byte[] ST25DV_CMD_GET_SYSTEM_INFO = { 0x2B }; //Command code
private byte[] ST25DV_CMD_READ_SINGLE_BLOCK = { 0x20, 0x00 }; //Command code, EEPROM block number (this will be received from caller).
private byte[] ST25DV_CMD_WRITE_SINGLE_BLOCK = { 0x21, 0x00, 0x00, 0x00, 0x00, 0x00 }; //Command code, EEPROM block number (this will be received from caller), 4-byte payload to be written (this will be received from caller).
private byte[] ST25DV_CMD_READ_MULTIPLE_BLOCKS = { 0x23, 0x00, 0x00 }; //Command code, EEPROM starting block number (this will be received from caller), number of blocks (this will be received from caller)
private byte[] ST25DV_CMD_READ_CONFIG = { 0xA0, 0x02, 0x00 }; //Command code, IC Mfg Code, Register address (this will be received from caller)
private byte[] ST25DV_CMD_READ_DYNAMIC_CONFIG = { 0xAD, 0x02, 0x00 }; //Command code, IC Mfg Code, Register address (this will be received from caller)
private byte[] ST25DV_CMD_WRITE_DYNAMIC_CONFIG = { 0xAE, 0x02, 0x00, 0x00 }; //Command code, IC Mfg Code, Register address, register value to be written
private readonly byte[] ST25DV_CMD_READ_MAILBOX_CONTROL_REG = { 0xAD, 0x02, 0x0D }; //Command code, IC Mfg Code, MB_CTRL_Dyn Register address
private readonly byte[] ST25DV_CMD_READ_MAILBOX_MESSAGE_LENGTH = { 0xAB, 0x02 }; //Command code, IC Mfg Code
private byte[] ST25DV_CMD_READ_MESSAGE = { 0xAC, 0x02, 0x00, 0x00 }; //Command code, IC Mfg Code, Mailbox pointer(mostly this is 0), NumberofBytesToRead (this will be received from caller)
private CR95HF_Reader _CR95HF_Reader;
private System.Timers.Timer _CycleTimeoutTimer = new System.Timers.Timer();
private static readonly Dictionary<byte, string> ST25DV_ErrorCodes = new Dictionary<byte, string>
{
{0x00 , "Success, No error" },
{0x01 , "Command is not supported" },
{0x02 , "Command is not recognized(format error)" },
{0x03 , "Option not supported" },
{0x0F , "Error with no information given" },
{0x10 , "The specified block is not available" },
{0x11 , "The specified block is already locked and thus cannot be locked again" },
{0x12 , "The specified block is locked and its contents cannot be changed" },
{0x13 , "The specified block was not successfully programmed" },
{0x14 , "The specified block was not successfully locked" },
{0x15 , "The specified block is protected in read" }
};
public event DelNfc_ST25DV_MessageHandler MessageEvent;
public ST25DV_Device(CR95HF_Reader CR95HFReader)
{
_CR95HF_Reader = CR95HFReader;
}
#region Message Event
private void OnMessageEvent(string message)
{
NfcMessageEventArgs e = new NfcMessageEventArgs();
e.Message = message;
if (MessageEvent != null)
{
MessageEvent(this, e);
}
e = null;
}
#endregion
public bool ST25DV_GetSystemInfo(out byte[] responseData)
{
byte[] response = new byte[20];
responseData = null;
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_GET_SYSTEM_INFO, out response))
{
if (response == null)
{
return false;
}
//Success - ResponseFlags = 0x00, 14 bytes payload
//Error - ResponseFlags = 0x01, 1 byte error code
if (response[0] == 0x00)
{
responseData = new byte[14];
for (int i=0; i<14; i++)
{
responseData[i] = response[i + 1];
}
//OnMessageEvent("Read GetSystemInfo: " + Tools.ByteArrayToHexString(responseData));
return true;
}
else
{
if ((responseData[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(responseData[1])))
OnMessageEvent("Read GetSystemInfo: Failed with ST25DV error - " + ST25DV_ErrorCodes[responseData[1]]);
}
}
OnMessageEvent("Read GetSystemInfo: Failed with ST25DV Unidentified error");
return false;
}
public bool ST25DV_ReadSingleBlock(byte blockNumber, out byte[] outBuffer, bool logEnabled = false)
{
byte[] response = null;
outBuffer = null;
int StartingByteAddress = Convert.ToInt32(blockNumber) * 4;
ST25DV_CMD_READ_SINGLE_BLOCK[1] = blockNumber;
if (logEnabled)
{
OnMessageEvent("Read EEPROM: 0x04" + " bytes from the address 0x" + Tools.DecimalToHexString(StartingByteAddress.ToString(), 1));
}
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_SINGLE_BLOCK, out response))
{
//Success - ResponseFlags = 0x00, payload
//Error - ResponseFlags = 0x01, 1 byte error code
if (response[0] == 0x00)
{
outBuffer = new byte[4];
for (int i = 0; i < 4; i++)
{
outBuffer[i] = response[1 + i];
}
if (logEnabled)
{
OnMessageEvent("Read EEPROM: " + Tools.BytesToHex(outBuffer));
}
return true;
}
else
{
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
OnMessageEvent("Read EEPROM: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
}
}
OnMessageEvent("Read EEPROM: Failed with ST25DV Unidentified error");
return false;
}
public bool ST25DV_WriteSingleBlock(byte blockNumber, byte[] inBuffer, bool logEnabled = false)
{
byte[] response = null;
int StartingByteAddress = Convert.ToInt32(blockNumber) * 4;
ST25DV_CMD_WRITE_SINGLE_BLOCK[1] = blockNumber;
for (int i = 0; i < 4; i++)
{
ST25DV_CMD_WRITE_SINGLE_BLOCK[2 + i] = inBuffer[i];
}
if (logEnabled)
{
OnMessageEvent("Write EEPROM: 0x04 bytes 0x" + Tools.BytesToHex(inBuffer) + " to the address 0x" + Tools.DecimalToHexString(StartingByteAddress.ToString(), 1));
}
//This will disable MB, 0x0D is MB_CTRL_Dyn register pointer and 0x00 is the value written
if (ST25DV_WriteDynamicConfiguration(0x0D, 0x00, false))
{
_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_WRITE_SINGLE_BLOCK, out response);
}
else
{
OnMessageEvent("Write EEPROM: MB disable failed");
return false;
}
//This function will leave ST25DV with MB disabled state and it needs to be enabled by I2C interface
return true;
}
public bool ST25DV_ReadMultipleBlocks(byte startingBlockNumber, byte numberOfBlocks, out byte [] outBuffer)
{
byte[] response = new byte[16]; //Maximum allowed to read is 16 bytes (4 blocks) with this command
outBuffer = null;
ST25DV_CMD_READ_MULTIPLE_BLOCKS[1] = startingBlockNumber;
ST25DV_CMD_READ_MULTIPLE_BLOCKS[2] = numberOfBlocks;
if (Convert.ToInt32(numberOfBlocks) >= 4) //maximum allowed to read with one command is 4 blocks (means 3)
{
OnMessageEvent("Read EEPROM: Invalid Input"); //TBD-needs to validate startingBlockNumber based on 4K or 16K or 64K chip read info
return false;
}
int totalReadBytes = (Convert.ToInt32(numberOfBlocks) + 1) * 4;
int StartingByteAddress = Convert.ToInt32(startingBlockNumber) * 4;
OnMessageEvent("Read EEPROM: " + "0x" + Tools.DecimalToHexString(totalReadBytes.ToString(),1) + " bytes from the byte " + "0x" + Tools.DecimalToHexString(StartingByteAddress.ToString(), 1));
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_MULTIPLE_BLOCKS, out response))
{
//Success - ResponseFlags = 0x00, payload
//Error - ResponseFlags = 0x01, 1 byte error code
if (response[0] == 0x00)
{
outBuffer = new byte[response.Length-4];
for (int i = 0; i < response.Length-4; i++)
{
outBuffer[i] = response[1 + i];
}
OnMessageEvent("Read EEPROM: " + Tools.BytesToHex(outBuffer));
return true;
}
else
{
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
OnMessageEvent("Read EEPROM: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
}
}
OnMessageEvent("Read EEPROM: Failed with ST25DV Unidentified error");
return false;
}
public bool ST25DV_ReadConfiguration(byte regAddress, out byte outBuffer, bool logEnabled = false)
{
byte[] response = null;
ST25DV_CMD_READ_CONFIG[2] = regAddress;
outBuffer = 0x00;
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_CONFIG, out response))
{
//Success - ResponseFlags = 0x00, 1 byte payload
//Error - ResponseFlags = 0x01, 1 byte error code
if (response[0] == 0x00)
{
outBuffer = response[1];
if (logEnabled)
{
OnMessageEvent("Read Static Config Register @address: " + "0x" + Tools.DecimalToHexString(Convert.ToInt32(regAddress).ToString(), 1) + " as " + Tools.ByteToHexString(outBuffer));
}
return true;
}
else
{
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
OnMessageEvent("Read Static Config Register: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
}
}
OnMessageEvent("Read Static Config Register: Failed with ST25DV Unidentified error");
return false;
}
public bool ST25DV_ReadDynamicConfiguration(byte regAddress, out byte outBuffer, bool logEnabled = false)
{
byte[] response = null;
ST25DV_CMD_READ_DYNAMIC_CONFIG[2] = regAddress;
outBuffer = 0x00;
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_DYNAMIC_CONFIG, out response))
{
//Success - ResponseFlags = 0x00, 1 byte payload
//Error - ResponseFlags = 0x01, 1 byte error code
if (response[0] == 0x00)
{
outBuffer = response[1];
if (logEnabled)
{
OnMessageEvent("Read Dynamic Config Register @address: " + "0x" + Tools.DecimalToHexString(Convert.ToInt32(regAddress).ToString(), 1) + " as " + Tools.ByteToHexString(outBuffer));
}
return true;
}
else
{
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
OnMessageEvent("Read Dynamic Config Register: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
}
}
OnMessageEvent("Read Dynamic Config Register: Failed with ST25DV Unidentified error");
return false;
}
public bool ST25DV_WriteDynamicConfiguration(byte regAddress, byte regValue, bool logEnabled)
{
byte[] response = null;
ST25DV_CMD_WRITE_DYNAMIC_CONFIG[2] = regAddress;
ST25DV_CMD_WRITE_DYNAMIC_CONFIG[3] = regValue;
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_WRITE_DYNAMIC_CONFIG, out response))
{
//Success - ResponseFlags = 0x00, success
//Error - ResponseFlags = 0x01, 1 byte error code
if (response[0] == 0x00)
{
if (logEnabled)
{
OnMessageEvent("Write Dynamic Config Register: Success");
}
return true;
}
else
{
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
OnMessageEvent("Write Dynamic Config Register: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
}
}
OnMessageEvent("Write Dynamic Config Register: Failed with ST25DV Unidentified error");
return false;
}
public bool ST25DV_ReadMailboxControlReg(out byte outBuffer)
{
byte[] response = null;
outBuffer = 0x00;
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_MAILBOX_CONTROL_REG, out response))
{
//Success - ResponseFlags = 0x00, 1 byte payload
//Error - ResponseFlags = 0x01, 1 byte error code
if (response[0] == 0x00)
{
outBuffer = response[1];
//OnMessageEvent("Read Dynamic Config Register MBCtrl @address: 0x0D" + " as " + Tools.ByteToHexString(outBuffer));
return true;
}
else
{
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
OnMessageEvent("Read Dynamic Config Register MBCtrl: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
}
}
OnMessageEvent("Read Dynamic Config Register MBCtrl: Failed with ST25DV Unidentified error");
return false;
}
public bool ST25DV_ReadMailboxMessageLength(out byte outBuffer, bool logEnabled = false)
{
byte[] response = null;
outBuffer = 0x00;
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_MAILBOX_MESSAGE_LENGTH, out response))
{
//Success - ResponseFlags = 0x00, 1 byte payload
//Error - ResponseFlags = 0x01, 1 byte error code
if (response[0] == 0x00)
{
outBuffer = response[1];
if (logEnabled)
{
OnMessageEvent("Read Mailbox Message Length: " + Tools.ByteToHexString(outBuffer));
}
return true;
}
else
{
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
OnMessageEvent("Read Mailbox Message Length: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
}
}
OnMessageEvent("Read Mailbox Message Length: Failed with ST25DV Unidentified error");
return false;
}
public bool ST25DV_ReadMessage(byte bytesToRead, out byte[] outBuffer)
{
byte[] response = null;
outBuffer = null;
ST25DV_CMD_READ_MESSAGE[2] = 0x00; //Pointer in mailbox, 0x00 indicates reads from beginning
ST25DV_CMD_READ_MESSAGE[3] = bytesToRead;
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_MESSAGE, out response))
{
outBuffer = new byte[response.Length-4];
//Success - ResponseFlags = 0x00, payload
//Error - ResponseFlags = 0x01, 1 byte error code
if (response[0] == 0x00)
{
for (int i = 0; i < response.Length-4; i++)
{
outBuffer[i] = response[1 + i];
}
//OnMessageEvent("Read Message: " + Tools.ByteArrayToHexString(outBuffer));
return true;
}
else
{
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
OnMessageEvent("Read Message Failed: With ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
}
}
OnMessageEvent("Read Message Failed: With ST25DV Unidentified error");
return false;
}
public bool ST25DV_WriteMessage(byte [] inBuffer)
{
byte[] response = null;
List<byte> ST25DV_CMD_WRITE_MESSAGE = new List<byte>();
ST25DV_CMD_WRITE_MESSAGE.Add(0xAA); //Write message command code
ST25DV_CMD_WRITE_MESSAGE.Add(0x02); //IC Mfg Code
ST25DV_CMD_WRITE_MESSAGE.Add(Convert.ToByte(inBuffer.Length - 1)); //This is the app given payload - 1
ST25DV_CMD_WRITE_MESSAGE.AddRange(inBuffer);
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_WRITE_MESSAGE.ToArray(), out response))
{
//Success - ResponseFlags = 0x00
//Error - ResponseFlags = 0x01, 1 byte error code
if (response[0] == 0x00)
{
//OnMessageEvent("Write Message: " + Tools.ByteArrayToHexString(inBuffer));
return true;
}
else
{
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
OnMessageEvent("Write Message Failed: With ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
}
}
OnMessageEvent("Write Message Failed: With ST25DV Unidentified error");
return false;
}
}
}
-160
View File
@@ -1,160 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
//*****************************************************************************
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
// Author: Venkat, Rajeshwar
//*****************************************************************************
namespace Sensus.iPerl.NfcHandler
{
public static class Tools
{
public static bool ByteArrayCompare(byte[] a1, byte[] a2)
{
// thanks to https://stackoverflow.com/questions/43289/comparing-two-byte-arrays-in-net
if (a1.Length != a2.Length)
return false;
for (int i = 0; i < a1.Length; i++)
if (a1[i] != a2[i])
return false;
return true;
}
public static string SwapHex(string sHex)
{
string sResult = "";
int iPos = sHex.Length - 2;
while (iPos >= 0)
{
sResult += sHex.Substring(iPos, 2);
sHex = sHex.Remove(iPos, 2);
iPos = sHex.Length - 2;
}
return sResult;
}
public static string DecimalToHexString(string value, int size = 1)
{
try
{
long Lval = long.Parse(value);
if (size == 1) return Lval.ToString("X2");
if (size == 2) return Lval.ToString("X4");
if (size == 4) return Lval.ToString("X8");
}
catch (Exception)
{
if (size == 1) return "00";
if (size == 2) return "0000";
if (size == 4) return "00000000";
}
return "00";
}
public static string ByteToHexString(byte data)
{
List<byte> val = new List<byte>();
val.Add(data);
byte[] arr = val.ToArray();
return BytesToHex(arr);
}
public static string BytesToHex(byte[] data)
{
StringBuilder sb = new StringBuilder();
foreach (byte b in data)
sb.Append(b.ToString("X2"));
return sb.ToString();
}
public static byte[] HexStringToByteArray(String hexString)
{
int numberChars = hexString.Length;
byte[] bytes = new byte[numberChars / 2];
for (int i = 0; i < numberChars; i += 2)
{
bytes[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
}
return bytes;
}
public enum InitialCrcValue
{
Zeros,
NonZero1 = 0xffff,
NonZero2 = 0x1D0F
}
public class Crc16Ccitt
{
private const ushort poly = 0x1021;
ushort[] table = new ushort[256];
ushort initialValue = 0;
public ushort ComputeChecksum(byte[] bytes)
{
ushort crc = this.initialValue;
for (int i = 0; i < bytes.Length; ++i)
{
crc = (ushort)((crc << 8) ^ table[((crc >> 8) ^ (0xff & bytes[i]))]);
}
return crc;
}
public byte[] ComputeChecksumBytes(byte[] bytes)
{
ushort crc = ComputeChecksum(bytes);
return BitConverter.GetBytes(crc);
}
public Crc16Ccitt(InitialCrcValue initialValue)
{
this.initialValue = (ushort) initialValue;
ushort temp, a;
for (int i = 0; i < table.Length; ++i)
{
temp = 0;
a = (ushort) (i << 8);
for (int j = 0; j < 8; ++j)
{
if (((temp ^ a) & 0x8000) != 0)
{
temp = (ushort) ((temp << 1) ^ poly);
}
else
{
temp <<= 1;
}
a <<= 1;
}
table[i] = temp;
}
}
public byte[] calcCRCfromMessage(byte[] message)
{
// CRC calculation goes from MessageID to Password
// For Read this means MsgID (1) + Offset (2) + PayloadLength (1) + Password (2) = 6
// for write the length of the payload comes on top.
// STX(1), length(1), CRC(2) and ETX(1) are excluded, in total 5 bytes.
//
// the method works both for sending messages (where the CRC and ETX are not in message)
// and for receiving messages (where the CRC and ETX are included at the end)
byte[] crc_msg = new byte[message[1]]; // message length is 2nd byte
Array.Copy(message, 2, crc_msg, 0, crc_msg.Length);
return ComputeChecksumBytes(crc_msg);
}
public string commentCRC(byte[] crc_meter, byte[] crc_computed)
{
bool crc_do_match = Tools.ByteArrayCompare(crc_meter, crc_computed);
string crcComment = crc_do_match ? "ok." : "CRC DOESN'T MATCH!!";
return "CRC Meter: " + Tools.BytesToHex(crc_meter) + (crc_do_match ? " == " : " != ")
+ "CRC Computed: " + Tools.BytesToHex(crc_computed) + ". " + crcComment;
}
public bool crc_do_match(byte[] a, byte[] b)
{
return ByteArrayCompare(a, b);
}
}
}
}
+1
View File
@@ -0,0 +1 @@
Test StartTime: when? Start of flow set or start of real test?
+192
View File
@@ -0,0 +1,192 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Results.Entities;
namespace Results
{
public class BatchResults
{
public readonly int WMPositionsCount;
public IList<Entities.TestData> TestDataList;
public IList<Entities.Components> ComponentsList;
public IList<Entities.WaterMeterData> WaterMeterDataList;
private BatchResults(int wmPositionsCount)
{
WMPositionsCount = wmPositionsCount;
TestDataList = new List<Entities.TestData>();
ComponentsList = new List<Entities.Components>();
WaterMeterDataList = new List<Entities.WaterMeterData>();
}
public Batch Batch;
public WaterMeter[] WaterMeters;
public static BatchResults NewFromProcedure(int batchNr, int benchId, string user, int userNr, string programVer,
Config.Entities.Procedure procedure,
WaterMeterData[] waterMeterDatas, int[] waterMeterParts)
{
BatchResults d = new BatchResults(waterMeterDatas.Length);
int year = DateTime.Now.Year;
/// Create new batch
d.Batch = new Batch()
{
TestBenchId = benchId,
BatchNr = batchNr,
ProgramVersion = programVer,
UserName = user,
UserNumber = userNr,
ProcedureName = procedure.Name,
ProcedureDescription = procedure.Description,
WatermetersStr = procedure.Watermeters,
ProcedureRevision = procedure.Revision,
ProtocolTitle = procedure.ProtocolTitle,
StartTime = DateTime.Now,
Compound = (procedure.MetersKind == Config.Entities.MetersKind.Combined),
#if HEAT_METERS
HeatMeter = (procedure.MetersKind == Config.Entities.MetersKind.HeatMeter),
#endif
};
///
/// Add watermeter to an array, array index is WM position.
/// AddWaterMetersToBatch() has to be used before saving results.
///
d.WaterMeters = new WaterMeter[d.WMPositionsCount];
for (int i = 0; i < d.WMPositionsCount; i++)
{
if (waterMeterDatas[i] == null) continue;
WaterMeterData wmd = WaterMeterData.UpdateList(d.WaterMeterDataList, waterMeterDatas[i]);
d.WaterMeters[i] = new WaterMeter()
{
Batch = d.Batch,
WaterMeterData = wmd,
WMPosition = i + 1,
YearOfProduction = year,
};
}
foreach (var t in procedure.Tests)
{
if (t.Publish != (byte)Config.Entities.Publish.Never)
{
TestData td = TestData.UpdateList(d.TestDataList, new TestData(t));
for (int rnr = 1; rnr <= t.Repeats; rnr++)
{
/// Create an empty test result and add it to the list
TestRslt tr = new TestRslt(d.Batch, td, t.Part, rnr);
d.Batch.TestRslts.Add(tr);
for (int i = 0; i < d.WMPositionsCount; i++)
{
if (d.WaterMeters[i] == null) continue;
if (t.Part != 0 && waterMeterParts[i] != 0 && t.Part != waterMeterParts[i]) continue;
///
/// Create empty watermeter test results and add them to the list and to dictionaries
///
IList<MeterTestRslt> wmtrs = d.WaterMeters[i].MeterTestRslts;
if (d.Batch.Compound)
{
/// Compound water meter
wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.CompoundMain));
wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.CompoundAux));
wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.Compound));
}
else if (d.Batch.HeatMeter)
{
/// Heat meter
wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.HeatMeterVolume));
wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.HeatMeterEnergy));
}
else
{
/// Water meter
wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.Single));
}
}
}
}
}
return d;
}
public static BatchResults FromBatch(Batch batch)
{
int wmCount = batch.WaterMeters.Count;
if (wmCount == 0) return null;
BatchResults batchResults = new BatchResults(wmCount);
batchResults.Batch = batch;
batchResults.WaterMeters = new WaterMeter[wmCount];
for (int i = 0; i < wmCount; i++) batchResults.WaterMeters[i] = batch.WaterMeters[i];
return batchResults;
}
public TestRslt GetTestRslt(string name, int part)
{
return Batch.GetTestRslt(name, part);
}
public MeterTestRslt GetMeterTestRslt(string name, int wmnr0, Config.Entities.CompoundMeterId meterId)
{
if (WaterMeters[wmnr0] != null)
{
return WaterMeters[wmnr0].GetMeterTestRslt(name, meterId);
}
return null;
}
/// <summary>
/// Returns true when all tests were done
/// </summary>
/// <returns>true = all tests done</returns>
public bool AllTestsDone()
{
for (int i = 0; i < WMPositionsCount; i++)
{
if (WaterMeters[i] != null)
{
foreach (var mtr in WaterMeters[i].MeterTestRslts)
{
if (!mtr.TestDone) return false;
}
}
}
return true;
}
/// <summary>
/// Adds non-null water meters from an array to a Batch water meters list.
/// This method should be used when results are prepared and
/// all disabled water meters are deleted.
/// </summary>
public void AddWaterMetersToBatch()
{
for (int i = 0; i < WMPositionsCount; i++)
{
if (WaterMeters[i] != null)
{
WaterMeters[i].Passed = WaterMeters[i].PassedFromTests();
if (!WaterMeters[i].Disabled)
{
Batch.WaterMeters.Add(WaterMeters[i]);
}
}
}
}
}
}
+309
View File
@@ -0,0 +1,309 @@
///
/// Copyright (c) 2013-2016 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using log4net;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using Results.Entities;
namespace Results
{
public static class DB
{
static readonly ILog log = LogManager.GetLogger(typeof(DB));
/// <summary> Session factory for all regular sessions, not for CreateEmptyResultsDB(). </summary>
public static ISessionFactory SessionFactory;
/// <summary> Connection string for all sessions </summary>
private static string connectionString;
///
public static string ConnectionString
{
get { return connectionString; }
set { connectionString = value; SessionFactory = null; }
}
/// <summary> Database type (MySQL or SQLite) for all sessions </summary>
private static Users.Entities.DBType dbType;
///
public static Users.Entities.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 Users.Entities.DBType.SQLite:
cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString));
break;
case Users.Entities.DBType.MySql:
cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString));
break;
}
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Entities.WaterMeterData>());
if (createDB)
{
return cfg.ExposeConfiguration(BuildSchemaCreate).BuildSessionFactory();
}
else
{
return cfg.ExposeConfiguration(BuildSchema).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();
}
public static void SaveObject(object obj)
{
SaveObject(CreateSession(), obj);
}
///
public static void SaveObject(ISession session, object obj)
{
using (var transaction = session.BeginTransaction())
{
session.SaveOrUpdate(obj);
try { transaction.Commit(); }
catch { }
}
}
public static void DeleteObject(object obj)
{
DeleteObject(CreateSession(), obj);
}
///
public static void DeleteObject(ISession session, object obj)
{
using (var transaction = session.BeginTransaction())
{
session.Delete(obj);
transaction.Commit();
}
}
/// <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;
}
/// <summary>
/// Shared data
/// </summary>
public static IList<Entities.TestData> TestDataList;
public static IList<Entities.Components> ComponentsList;
public static IList<Entities.WaterMeterData> WaterMeterDataList;
/// <summary>
/// Loads shared data from the database
/// </summary>
/// <exception>Throws NHibernate exceptions</exception>
public static void LoadSharedData()
{
ISession session = DB.CreateSession();
TestDataList = session.QueryOver<TestData>().List();
ComponentsList = session.QueryOver<Components>().List();
WaterMeterDataList = session.QueryOver<WaterMeterData>().List();
}
/// <summary>
/// Loads shared data from the database
/// </summary>
/// <exception>Throws NHibernate exceptions</exception>
public static int GetMaxSavedBatchNr()
{
ISession session = DB.CreateSession();
IList<Entities.Batch> batches = session.QueryOver<Batch>().List();
int maxBatchNr = 0;
foreach (var b in batches)
{
if (b.BatchNr > maxBatchNr) maxBatchNr = b.BatchNr;
}
return maxBatchNr;
}
/// <summary>
/// Update TestData, Components and WaterMeterData fo tests and water meters in batch results
/// with existing data in static lists TestDataList, ComponentsList and WaterMeterDataList.
/// </summary>
/// <param name="batch">Batch results</param>
/// <returns>true when any data modiifed</returns>
public static bool UpdateBatchData(Entities.Batch batch)
{
ISession session = DB.CreateSession();
if (session == null) return false;
foreach (var tr in batch.TestRslts)
{
/// Search in TestDataList and update test data in the new batch
TestData td = TestData.UpdateList(TestDataList, tr.TestData);
tr.TestData = td;
/// Search in ComponentsList and update components in the new batch
Components cd = Components.UpdateList(ComponentsList, tr.Components);
tr.Components = cd;
}
foreach (var wm in batch.WaterMeters)
{
/// Search in WaterMeterDataList and update water meter data in the new batch
WaterMeterData wmd = WaterMeterData.UpdateList(WaterMeterDataList, wm.WaterMeterData);
wm.WaterMeterData = wmd;
}
return true; /// TODO: Really check for modifications
}
public static bool SaveNewBatch(Entities.Batch batch)
{
ISession session = DB.CreateSession();
if (session == null) return false;
TestDataList = session.QueryOver<TestData>().List();
ComponentsList = session.QueryOver<Components>().List();
WaterMeterDataList = session.QueryOver<WaterMeterData>().List();
UpdateBatchData(batch);
ITransaction transaction = session.BeginTransaction();
if (transaction == null) return false;
try
{
foreach (var td in TestDataList) if (td.Id == 0) session.SaveOrUpdate(td);
foreach (var cd in ComponentsList) if (cd.Id == 0) session.SaveOrUpdate(cd);
foreach (var wd in WaterMeterDataList) if (wd.Id == 0) session.SaveOrUpdate(wd);
session.SaveOrUpdate(batch);
transaction.Commit();
}
catch (Exception exc)
{
transaction.Rollback();
log.FatalFormat("Saving results of batch #{0} into the results DB failed: {1}", batch.BatchNr, exc.Message);
return false;
}
session.Flush();
return true;
}
public static Batch LoadBatch(int batchNr)
{
IList<Batch> batches;
ISession session = DB.CreateSession();
if (session == null) return null;
TestDataList = session.QueryOver<TestData>().List();
ComponentsList = session.QueryOver<Components>().List();
WaterMeterDataList = session.QueryOver<WaterMeterData>().List();
try
{
batches = session.QueryOver<Batch>()
.Where(x => (x.BatchNr == batchNr))
.List();
foreach (var batch in batches)
{
batch.TestRslts = session.QueryOver<TestRslt>()
.Where(x => (x.Batch.Id == batch.Id))
.List();
batch.WaterMeters = session.QueryOver<WaterMeter>()
.Where(x => (x.Batch.Id == batch.Id))
.List();
}
}
catch (Exception exc)
{
log.FatalFormat("Cannot load batch #{0}: {1}", batchNr, exc.Message);
return null;
}
return (batches.Count > 0) ? batches[0] : null;
}
}
}
+63
View File
@@ -0,0 +1,63 @@
///
/// Copyright (c) 2017 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using log4net;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using Results.Entities;
namespace Results
{
public class DBase
{
static readonly ILog log = LogManager.GetLogger(typeof(DBase));
/// <summary> Session factory for all regular sessions, not for CreateEmptyResultsDB(). </summary>
public static IList<DBase> Databases;
public static int Count { get { return Databases.Count; } }
static DBase()
{
Databases = new List<DBase>();
}
public readonly string Name;
public readonly string ConnectionString;
ISessionFactory sessionFactory;
public DBase(string connectionString, string name)
{
this.ConnectionString = connectionString;
this.Name = name;
sessionFactory = Fluently.Configure()
.Database(MySQLConfiguration.Standard.ConnectionString(connectionString))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Entities.WaterMeterData>())
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
public DBase(string connectionString)
: this(connectionString, string.Empty)
{
}
private void BuildSchema(Configuration config)
{
/// This NHibernate tool takes a configuration with mapping info and exports a database schema
new SchemaExport(config).SetOutputFile("db_schema");
}
public ISession OpenSession()
{
return sessionFactory.OpenSession();
}
}
}

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