Squashed commit of the following:

commit c64fa8fe9d
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Mar 7 11:24:20 2024 +0000

    opt to easily turn off restart debug output

commit 48c5387291
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Mar 7 09:22:45 2024 +0000

    binary store count (#129)

    Fix issue in binary store object count

commit 769193703a
Merge: 308442f2 23062c3f
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Mar 7 09:16:45 2024 +0000

    Merge branch 'restart' into main

commit 308442f201
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Mar 7 09:14:33 2024 +0000

    Merge from dg dev main (#128)

    * updating Tethys help

    * added help details server connection & calibration

    * Reporting outputs to user

    Use Pamguard WarnOnce system to show a message of success or failure
    after attempting to output to Tethys.

    * Removing empty fields

    Start of implementation of code that can remove empty fields from
    objects before they are written.

    * More help documentation

    Continued writing general export help.
    Added new css style
    Added image

    * Fix type in Deployment export

    * Prevent single deployment export

    For now, disable the option to export a single Deployment document for
    multiple recording periods.

    * System to search species codes

    Search the ITIS species codes in Tethys to find ITIS codes. Search can
    be on a common or scientific name.

    * Data blocks help + species codes

    More help documentation on exporting detections/localization as well as mapping detection species codes to TSNs.  Includes supporting images

    * Improved dialog for finding species codes

    Now has a progress bar to block GUI while searching database.

    * Add species codes TOC in help

    * Documented new species search in help

    * Nilus Checker

    Can check a Nilus class to see if it's missing required objects and be
    used to remove empty fields (e.g. zero length strings) from an object.

    * fixed anchor html problem

    * Messing around with checking of required fields in nilus objects.

    * split Tethys help files into smaller chunks

    * Update button enablers

    And reinstate output of a single deployment document, with non-recording
    periods stores in the QA section

    And update help TOC for latest help documents.

    ---------

    Co-authored-by: Marie <marie.roch@sdsu.edu>

commit 23062c3ff4
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Mar 4 13:59:09 2024 +0000

    Update PamController.java

    add in debug output at start and stop

commit 85b47c86af
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Mar 4 13:05:56 2024 +0000

    exception handling

    A bit more exception handling in click train detector and output of a version 10aa/other

commit e3ffd56f69
Merge: 1200b13f e6c2f325
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Mar 4 12:28:42 2024 +0000

    Merge branch 'restart' of https://github.com/douggillespie/PAMGuard into restart

commit e6c2f325b2
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sat Mar 2 10:43:41 2024 +0000

    Binary store

    Fix err in binary footer where count of objects also included the count
    of noise measurements.

commit 45b99273fa
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Feb 27 19:09:58 2024 +0000

    Restore single param call into PamParameterSet.autoGenerate

commit c36ad2a33a
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Feb 27 15:55:02 2024 +0000

    Fix settings load.

    Problems in viewer mode with long (>50char) settings names which don't
    get fully stored in the database. Fixed by only looking at the start of
    the name. Better to not use such long names.

commit 2721095a03
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Feb 27 14:08:22 2024 +0000

    Fix compound data selector V2.02.10b

    also a bug in logger forms if malformed UDF's

commit 1200b13f95
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Feb 23 15:53:00 2024 +0000

    Exception handling in CTD

commit 156952bafe
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Feb 22 17:40:45 2024 +0000

    Update MHTClickTrainAlgorithm.java

    Synchronize calls into MHT Algorithm across threads (can mess up during restarts otherwise)

commit e491028ef7
Merge: d2263bbb 21b4bc13
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Feb 15 16:52:29 2024 +0000

    Merge pull request #66 from PAMGuard/main

    merge from main

commit d2263bbba5
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Feb 15 16:48:33 2024 +0000

    Functions for better restarting after buffer overflow.

commit 21b4bc130d
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Feb 9 11:53:35 2024 +0000

    Hydrophone data loading

    Change how hydrophone data are loaded in viewer. Don't load ALL data.
    Load the loading period + some before the load period which will be one
    minute of data PLUS an extra n*2 data before that extra minute where n
    is the number of hydrophones.

commit e52701353a
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Feb 5 13:34:15 2024 +0000

    Fix data integrity bug

    Fix of bug that 'fixed' event start and end times in database for linked
    parent / child event tables. Error was caused by a mix up between
    ParentID and ParentUID fields.

commit 66b73c45e2
Merge: 0dc47fcb 9fe8e353
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Feb 2 09:08:19 2024 +0000

    Merge branch 'main' of https://github.com/PAMGuard/PAMGuard.git into main

commit 0dc47fcb0b
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Feb 2 09:07:55 2024 +0000

    click display arrangement

    Added options to NOT automatically rearrange all the windows in the
    click display every time the display size changes

commit 9609546602
Merge: 82e02a21 67e58416
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Jan 30 15:01:04 2024 +0000

    Merge pull request #65 from douggillespie/Tethys

    Tethys

commit 67e5841668
Merge: 6b184529 9fe8e353
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Jan 30 15:00:00 2024 +0000

    Merge pull request #64 from PAMGuard/main

    Merge from main

commit 9fe8e35322
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Jan 30 14:58:50 2024 +0000

    MErge from dg (#127)

    * updating Tethys help

    * added help details server connection & calibration

    * Reporting outputs to user

    Use Pamguard WarnOnce system to show a message of success or failure
    after attempting to output to Tethys.

    * Removing empty fields

    Start of implementation of code that can remove empty fields from
    objects before they are written.

    * More help documentation

    Continued writing general export help.
    Added new css style
    Added image

    * Fix type in Deployment export

    * Prevent single deployment export

    For now, disable the option to export a single Deployment document for
    multiple recording periods.

    * System to search species codes

    Search the ITIS species codes in Tethys to find ITIS codes. Search can
    be on a common or scientific name.

    * Data blocks help + species codes

    More help documentation on exporting detections/localization as well as mapping detection species codes to TSNs.  Includes supporting images

    * Improved dialog for finding species codes

    Now has a progress bar to block GUI while searching database.

    * Add species codes TOC in help

    * Documented new species search in help

    * Nilus Checker

    Can check a Nilus class to see if it's missing required objects and be
    used to remove empty fields (e.g. zero length strings) from an object.

    * fixed anchor html problem

    * Messing around with checking of required fields in nilus objects.

    * split Tethys help files into smaller chunks

    * Update button enablers

    And reinstate output of a single deployment document, with non-recording
    periods stores in the QA section

    And update help TOC for latest help documents.

    ---------

    Co-authored-by: Marie <marie.roch@sdsu.edu>

commit 1c532906ca
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Jan 30 14:57:38 2024 +0000

    Merge from dg (#126)

    * updating Tethys help

    * added help details server connection & calibration

    * Reporting outputs to user

    Use Pamguard WarnOnce system to show a message of success or failure
    after attempting to output to Tethys.

    * Removing empty fields

    Start of implementation of code that can remove empty fields from
    objects before they are written.

    * More help documentation

    Continued writing general export help.
    Added new css style
    Added image

    * Fix type in Deployment export

    * Prevent single deployment export

    For now, disable the option to export a single Deployment document for
    multiple recording periods.

    * System to search species codes

    Search the ITIS species codes in Tethys to find ITIS codes. Search can
    be on a common or scientific name.

    * Data blocks help + species codes

    More help documentation on exporting detections/localization as well as mapping detection species codes to TSNs.  Includes supporting images

    * Improved dialog for finding species codes

    Now has a progress bar to block GUI while searching database.

    * Add species codes TOC in help

    * Documented new species search in help

    * Nilus Checker

    Can check a Nilus class to see if it's missing required objects and be
    used to remove empty fields (e.g. zero length strings) from an object.

    * fixed anchor html problem

    * Messing around with checking of required fields in nilus objects.

    * split Tethys help files into smaller chunks

    * Update button enablers

    And reinstate output of a single deployment document, with non-recording
    periods stores in the QA section

    And update help TOC for latest help documents.

    ---------

    Co-authored-by: Marie <marie.roch@sdsu.edu>

commit 82e02a21b3
Merge: 8b57a398 c4192a73
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Jan 30 14:56:43 2024 +0000

    Merge pull request #63 from PAMGuard/main

    MErge from main

commit c4192a7323
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Jan 30 14:51:29 2024 +0000

    Version 2.02.10

    final commit of updated version info for release

commit 5466914d4e
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Jan 30 11:55:34 2024 +0000

    Merge from dev branch (#125)

    * updating Tethys help

    * added help details server connection & calibration

    * Reporting outputs to user

    Use Pamguard WarnOnce system to show a message of success or failure
    after attempting to output to Tethys.

    * Removing empty fields

    Start of implementation of code that can remove empty fields from
    objects before they are written.

    * More help documentation

    Continued writing general export help.
    Added new css style
    Added image

    * Fix type in Deployment export

    * Prevent single deployment export

    For now, disable the option to export a single Deployment document for
    multiple recording periods.

    * System to search species codes

    Search the ITIS species codes in Tethys to find ITIS codes. Search can
    be on a common or scientific name.

    * Data blocks help + species codes

    More help documentation on exporting detections/localization as well as mapping detection species codes to TSNs.  Includes supporting images

    * Improved dialog for finding species codes

    Now has a progress bar to block GUI while searching database.

    * Add species codes TOC in help

    * Documented new species search in help

    * Nilus Checker

    Can check a Nilus class to see if it's missing required objects and be
    used to remove empty fields (e.g. zero length strings) from an object.

    * fixed anchor html problem

    * Messing around with checking of required fields in nilus objects.

    * split Tethys help files into smaller chunks

    * Update button enablers

    And reinstate output of a single deployment document, with non-recording
    periods stores in the QA section

    And update help TOC for latest help documents.

    ---------

    Co-authored-by: Marie <marie.roch@sdsu.edu>

commit 8b57a3982a
Merge: f4993425 cb0d191c
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Jan 30 11:54:17 2024 +0000

    Merge pull request #62 from PAMGuard/main

    Update README.html

commit f4993425b5
Merge: dacfab07 6b184529
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Jan 30 11:52:32 2024 +0000

    Merge pull request #61 from douggillespie/Tethys

    TethysMerge in from Tetthys

commit cb0d191c08
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Jan 29 20:50:07 2024 +0000

    Update README.html

    Fix problems of weird characters in readme.html

commit 6b1845293c
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Jan 29 16:54:24 2024 +0000

    Update button enablers

    And reinstate output of a single deployment document, with non-recording
    periods stores in the QA section

    And update help TOC for latest help documents.

commit 810ec67077
Author: Marie <marie.roch@sdsu.edu>
Date:   Fri Jan 26 19:56:45 2024 -0800

    split Tethys help files into smaller chunks

commit dacfab07f5
Merge: a6765d72 53ca798f
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 26 10:02:00 2024 +0000

    Merge pull request #60 from PAMGuard/main

    Correct sorting of input sound files

commit 53ca798f1b
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 26 09:57:57 2024 +0000

    Correct sorting of input sound files

commit 88be6ffe2e
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Jan 25 18:04:57 2024 +0000

    Messing around with checking of required fields in nilus objects.

commit fe33930ca8
Author: Marie <marie.roch@sdsu.edu>
Date:   Wed Jan 24 11:50:20 2024 -0800

    fixed anchor html problem

commit fdfa9a20d8
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jan 24 16:32:30 2024 +0000

    Nilus Checker

    Can check a Nilus class to see if it's missing required objects and be
    used to remove empty fields (e.g. zero length strings) from an object.

commit b78bbe8b9e
Merge: c0080ae4 a6765d72
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jan 24 14:50:22 2024 +0000

    Merge pull request #59 from douggillespie/main

    merge from main

commit a6765d72b1
Merge: efdf17f6 5fcd3607
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jan 24 14:46:39 2024 +0000

    Merge pull request #58 from PAMGuard/main

    Remove comments in split positioner

commit 5fcd360737
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jan 24 14:46:05 2024 +0000

    Remove comments in split positioner

commit c0080ae4f4
Merge: f1bb6e4c efdf17f6
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jan 24 14:37:24 2024 +0000

    Merge remote-tracking branch 'origin/main' into Tethys

    Conflicts:
    	src/help/JavaHelpSearch/DOCS
    	src/help/JavaHelpSearch/DOCS.TAB
    	src/help/JavaHelpSearch/OFFSETS
    	src/help/JavaHelpSearch/POSITIONS
    	src/help/JavaHelpSearch/SCHEMA
    	src/help/JavaHelpSearch/TMAP
    	src/help/utilities/tethys/docs/tethys_quickstart.html

commit f1bb6e4c0c
Author: Marie <marie.roch@sdsu.edu>
Date:   Tue Jan 23 14:33:50 2024 -0800

    Documented new species search in help

commit 971165b72e
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Jan 23 11:12:54 2024 +0000

    Add species codes TOC in help

commit 3d7224eb93
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Jan 22 18:04:57 2024 +0000

    Improved dialog for finding species codes

    Now has a progress bar to block GUI while searching database.

commit 7d30b303e7
Author: Marie <marie.roch@sdsu.edu>
Date:   Sun Jan 21 15:24:13 2024 -0800

    Data blocks help + species codes

    More help documentation on exporting detections/localization as well as mapping detection species codes to TSNs.  Includes supporting images

commit baff8d140c
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun Jan 21 21:35:34 2024 +0000

    System to search species codes

    Search the ITIS species codes in Tethys to find ITIS codes. Search can
    be on a common or scientific name.

commit 54cb0d1b08
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun Jan 21 17:01:10 2024 +0000

    Prevent single deployment export

    For now, disable the option to export a single Deployment document for
    multiple recording periods.

commit 522253b489
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun Jan 21 16:25:03 2024 +0000

    Fix type in Deployment export

commit 98bc7587b5
Merge: c8bc943f e0392de9
Author: Marie <marie.roch@sdsu.edu>
Date:   Sat Jan 20 20:01:19 2024 -0800

    Merge branch 'Tethys' of https://github.com/douggillespie/PAMGuard into Tethys

commit c8bc943ff7
Author: Marie <marie.roch@sdsu.edu>
Date:   Sat Jan 20 20:01:05 2024 -0800

    More help documentation

    Continued writing general export help.
    Added new css style
    Added image

commit e0392de9c7
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 19 17:29:12 2024 +0000

    Removing empty fields

    Start of implementation of code that can remove empty fields from
    objects before they are written.

commit 65300d719a
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 19 16:29:41 2024 +0000

    Reporting outputs to user

    Use Pamguard WarnOnce system to show a message of success or failure
    after attempting to output to Tethys.

commit fa02c9826c
Merge: 3f2e4239 7efc8242
Author: Marie <marie.roch@sdsu.edu>
Date:   Thu Jan 18 19:37:29 2024 -0800

    Merge branch 'Tethys' of https://github.com/douggillespie/PAMGuard into Tethys

commit 3f2e4239b0
Author: Marie <marie.roch@sdsu.edu>
Date:   Thu Jan 18 19:37:17 2024 -0800

    added help details server connection & calibration

commit efdf17f651
Merge: 02f1889e e5fda7f7
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Jan 18 09:39:55 2024 +0000

    Merge pull request #57 from PAMGuard/main

    merge from main

commit e5fda7f72a
Merge: 3ed9be4b 02f1889e
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Jan 18 09:39:45 2024 +0000

    Merge branch 'main' into main

commit 3ed9be4bfd
Merge: 42b72960 43811c1f
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Jan 18 09:36:56 2024 +0000

    Merge branch 'main' of https://github.com/PAMGuard/PAMGuard.git into
    main

commit 42b7296075
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Jan 18 09:36:10 2024 +0000

    Hide Tethys module

    and remove text output in splitpanepositioner

commit 02f1889e39
Merge: 0bc3968d 52bbff36
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Jan 18 09:33:26 2024 +0000

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard.git into main

    Conflicts:
    	src/binaryFileStorage/BinaryStore.java

commit 43811c1f9b
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Jan 18 09:31:00 2024 +0000

    Merge from DG  (#124)

    * claspath update

    * Batch processing

    Adding functionality for offline task batch processing.

commit 52bbff36e5
Merge: 0c035aa0 b373e169
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Jan 18 09:29:50 2024 +0000

    Merge pull request #56 from PAMGuard/main

    Merge from main

commit 0bc3968dc8
Merge: 52cc8c71 a3a74adb
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jan 17 21:28:02 2024 +0000

    Fix err in binary store

commit 0c035aa0fe
Merge: 52cc8c71 a3a74adb
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jan 17 21:28:02 2024 +0000

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard

commit 52cc8c7177
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jan 17 21:24:04 2024 +0000

    Batch processing

    Adding functionality for offline task batch processing.

commit b373e169f2
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jan 17 21:13:14 2024 +0000

    updating Tethys help (#123)

commit 5d83af1d42
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jan 17 21:11:31 2024 +0000

    updating Tethys help (#122)

commit 7efc824226
Merge: d05cecaf bb17d384
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jan 17 21:11:13 2024 +0000

    Merge branch 'main' into Tethys

commit a3a74adb78
Merge: ac1a7f87 bb17d384
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jan 17 14:37:30 2024 +0000

    Merge pull request #55 from PAMGuard/main

    MErge from main

commit d05cecaf8b
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 12 18:57:38 2024 +0000

    updating Tethys help

commit 7a1c697319
Merge: 21fa4aff ac1a7f87
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 12 15:41:54 2024 +0000

    Merge remote-tracking branch 'origin/main' into Tethys

    Conflicts:
    	pom.xml
    	src/PamController/PamguardVersionInfo.java

commit bb17d384b3
Merge: 031f4c7a 21fa4aff
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 12 15:34:05 2024 +0000

    Merge branch 'Tethys' into main

commit ac1a7f87ac
Merge: 133da119 031f4c7a
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 12 15:29:05 2024 +0000

    Merge pull request #53 from PAMGuard/main

    changes from main

commit 031f4c7ab4
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 12 15:28:23 2024 +0000

    V 2.02.09aa with click marking bug fix

commit 217283c704
Merge: 4856a827 46d01e62
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 12 11:58:31 2024 +0000

    Merge branch 'main' of https://github.com/PAMGuard/PAMGuard

commit 4856a827df
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 12 11:57:11 2024 +0000

    click labelling

    fixed a couple of problems in click labelling (Viewer mode) when clics
    were reassigned to different events.

commit df178a4122
Merge: 782057c0 133da119
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 12 10:16:35 2024 +0000

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard.git into main

commit 133da119e0
Merge: f097ddce 46d01e62
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 12 10:16:12 2024 +0000

    Merge pull request #52 from PAMGuard/main

    Merge from main

commit 46d01e62db
Merge: 0e5bca51 f097ddce
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 12 10:16:00 2024 +0000

    Merge branch 'main' into main

commit 0e5bca5198
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 12 10:11:21 2024 +0000

    Update X3 lib to 2.2.7

commit 21fa4aff07
Merge: 73810b85 716eb1fa
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sat Dec 30 18:50:58 2023 +0000

    Merge branch 'Tethys' of https://github.com/douggillespie/PAMGuard.git
    into Tethys

    Conflicts:
    	src/tethys/swing/TethysMainPanel.java

commit 73810b85bf
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sat Dec 30 18:48:24 2023 +0000

    use new diider location memory

commit 7a5e8f1031
Merge: e48eb002 f097ddce
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sat Dec 30 17:39:28 2023 +0000

    Merge branch 'main' into Tethys

    Conflicts:
    	pom.xml
    	src/PamController/PamguardVersionInfo.java

commit e48eb00204
Merge: 70fbeaaf 1b8bb14e
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sat Dec 30 17:37:02 2023 +0000

    Merge remote-tracking branch 'upstream/main' into Tethys

    Conflicts:
    	pom.xml
    	src/loggerForms/FormsDataDisplayTable.java

commit 70fbeaafde
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sat Dec 30 17:32:57 2023 +0000

    work on deployment wizards

commit 782057c020
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sat Dec 30 17:28:23 2023 +0000

    claspath update

commit 716eb1faa7
Merge: c63fb3f3 e29f6f05
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sat Dec 30 17:26:43 2023 +0000

    Merge branch 'Tethys' of https://github.com/douggillespie/PAMGuard into Tethys

commit c63fb3f341
Merge: 56bab82b b7cbd259
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sat Dec 30 17:07:17 2023 +0000

    Merge branch 'main' into Tethys

    Conflicts:
    	src/loggerForms/FormsDataDisplayTable.java

commit f097ddce45
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sat Dec 30 17:01:46 2023 +0000

    Split pane positioner

    Handy little class for remembering and restoring the positions of
    jSplitPane's

commit f5c3ce06ce
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Dec 29 17:55:30 2023 +0000

    Database opening from Explorer

    Sorted so that a viewer database can be opened by right clicking on a
    sqlite3 file. Requires updated installer to make appropriate registry
    changes. Will be in 2.02.10

commit e29f6f0589
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Dec 22 13:38:18 2023 +0000

    Fix Effort null pointers

    Trap a coupld of null pointer exceptions which get thrown when there are
    no acoustic data.

commit 56bab82be3
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 21 18:34:58 2023 +0000

    POM Excludes signature files

    Updated POM file to correctly exclude signature files which prevented
    PAMGuard from running from the installed version (unless these were
    manually removed from the jar file).

commit 99aa3f342c
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 21 17:07:23 2023 +0000

    Update nilus and javaclient

    Updated java client and nilus jar builds for Maven.

commit f4a42d2bb2
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 21 11:22:01 2023 +0000

    update pom to groupid tethys

commit 1b8bb14e9d
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Dec 20 16:47:18 2023 +0000

    Pre release V2.02.09f

    With release notes for V2.02.10 which is coming soon ...

commit f9a0716c0f
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Dec 20 14:51:10 2023 +0000

    Updates from DG (#120)

    * Stop command

    small change so command is available as a constant

    * Lots of small updates to enable opening of a secondary configuration for
    batch processing control.

    * Fix user input bug in viewer

    which created exponential copies of user comments!

    * Adding TAST trigger alarm action

    To be competed when GW provide correct string for interface

    * Echo offline detection

    Fix up affected datablocks for offline echo detection

    * fix module import

    System for importing modules from other psfx files was not working.
    Probably wasn't working for quite some time. Now fixed.

    * Bug fixes to Match Template classifier

    1) When a large template was imported only 1: fftLength of the mathc waveform was used and so clicks would be correlated with noise. The peak of the template is now used when the peak search function is selected.
    2) The plus button in the tab pane had disappeared.
    3) Seems like the decimators were the wrong round. So the waveforms were using an up sample function when they should have been using a decimator function. and vice versa...major bug when using different sample rates!

    * Fix merge

    Merged in a single commit from Jamies fork that had updates to the
    template classifier. Then had to make a few changes to get it working
    with other changes J had made that must have been in other commits.

    * Logger forms viewer

    Viewer display of logger forms was throwing exceptions on Boolean values
    which had been stored as a String or Integer 0 or 1 in some databases.
    Now fixed to turn these into a sensible boolean value for the data table

    * Logger form plotting

    Fixed logger form plotting in Viewer so that points can find their
    correct GPS position (based on time)

    * Fix small bugs

    * Fix settings import

    not all imports working. Now seems fixed.

    ---------

    Co-authored-by: Jamie Mac <macster110@gmail.com>

commit b7cbd2592f
Merge: ae8839e7 639f3360
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Dec 20 14:48:30 2023 +0000

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard.git into main

commit ae8839e756
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Dec 20 14:48:15 2023 +0000

    Fix settings import

    not all imports working. Now seems fixed.

commit 639f33607e
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Dec 20 09:05:33 2023 +0000

    Fix small bugs

commit 3e4dd77908
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Dec 19 16:41:57 2023 +0000

    Logger form plotting

    Fixed logger form plotting in Viewer so that points can find their
    correct GPS position (based on time)

commit 1d9768b8c1
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Dec 19 16:41:57 2023 +0000

    Logger form plotting

    Fixed logger form plotting in Viewer so that points can find their
    correct GPS position (based on time)

commit 2fa91d69a5
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Dec 19 16:41:57 2023 +0000

    Logger form plotting

    Fixed logger form plotting in Viewer so that points can find their
    correct GPS position (based on time)

commit 1461808b14
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Dec 19 16:41:57 2023 +0000

    Logger form plotting

    Fixed logger form plotting in Viewer so that points can find their
    correct GPS position (based on time)

commit 54f5a5f0fb
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Dec 19 15:54:38 2023 +0000

    Logger forms viewer

    Viewer display of logger forms was throwing exceptions on Boolean values
    which had been stored as a String or Integer 0 or 1 in some databases.
    Now fixed to turn these into a sensible boolean value for the data table

commit 0085215eff
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Dec 19 15:54:38 2023 +0000

    Logger forms viewer

    Viewer display of logger forms was throwing exceptions on Boolean values
    which had been stored as a String or Integer 0 or 1 in some databases.
    Now fixed to turn these into a sensible boolean value for the data table

commit ea6caecc67
Merge: d200e5c2 bfbb58ea
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Dec 19 12:45:56 2023 +0000

    Updated POM

    working POM for build with Tethys. Note though that it's failing to get
    rid of all signature files in the \META-INF\ folder, so the two files
    META-INF\ECLIPSE_.SF and META-INF\ECLIPSE_.RSA must be removed before
    the jar file can be used.

commit d200e5c2df
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 18 18:30:41 2023 +0000

    Maven stuff for nilus and javaclient

commit bfbb58ea5a
Merge: 480f55f6 d1b40c1d
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 18 18:25:29 2023 +0000

    Merge pull request #51 from PAMGuard/main

    get whistle det fix

commit d1b40c1d86
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 18 16:48:36 2023 +0000

    Release V2.02.09e

    fixes to WMD stub removal to make it a lot faster.

commit 3cf0a4e1e6
Merge: 25d10d54 480f55f6
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 18 15:27:24 2023 +0000

    Merge remote-tracking branch 'origin/main' into Tethys

commit 291b00e1b1
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 18 15:19:22 2023 +0000

    Merge from DG with fixes to MatchedTemplate classifier.  (#119)

    * Stop command

    small change so command is available as a constant

    * Lots of small updates to enable opening of a secondary configuration for
    batch processing control.

    * Fix user input bug in viewer

    which created exponential copies of user comments!

    * Adding TAST trigger alarm action

    To be competed when GW provide correct string for interface

    * Echo offline detection

    Fix up affected datablocks for offline echo detection

    * fix module import

    System for importing modules from other psfx files was not working.
    Probably wasn't working for quite some time. Now fixed.

    * Bug fixes to Match Template classifier

    1) When a large template was imported only 1: fftLength of the mathc waveform was used and so clicks would be correlated with noise. The peak of the template is now used when the peak search function is selected.
    2) The plus button in the tab pane had disappeared.
    3) Seems like the decimators were the wrong round. So the waveforms were using an up sample function when they should have been using a decimator function. and vice versa...major bug when using different sample rates!

    * Fix merge

    Merged in a single commit from Jamies fork that had updates to the
    template classifier. Then had to make a few changes to get it working
    with other changes J had made that must have been in other commits.

    ---------

    Co-authored-by: Jamie Mac <macster110@gmail.com>

commit 480f55f6e9
Merge: 2f41c986 667b68e2
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 18 15:18:18 2023 +0000

    Merge pull request #50 from PAMGuard/main

    merge from main (#118)

commit 2f41c986f4
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 18 14:58:24 2023 +0000

    Fix merge

    Merged in a single commit from Jamies fork that had updates to the
    template classifier. Then had to make a few changes to get it working
    with other changes J had made that must have been in other commits.

commit 1b9d80b0eb
Author: Jamie Mac <macster110@gmail.com>
Date:   Thu Dec 14 12:06:51 2023 +0000

    Bug fixes to Match Template classifier

    1) When a large template was imported only 1: fftLength of the mathc waveform was used and so clicks would be correlated with noise. The peak of the template is now used when the peak search function is selected.
    2) The plus button in the tab pane had disappeared.
    3) Seems like the decimators were the wrong round. So the waveforms were using an up sample function when they should have been using a decimator function. and vice versa...major bug when using different sample rates!

commit 667b68e231
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 18 14:09:30 2023 +0000

    merge from main (#118)

    * Stop command

    small change so command is available as a constant

    * Lots of small updates to enable opening of a secondary configuration for
    batch processing control.

    * Fix user input bug in viewer

    which created exponential copies of user comments!

    * Adding TAST trigger alarm action

    To be competed when GW provide correct string for interface

    * Echo offline detection

    Fix up affected datablocks for offline echo detection

    * fix module import

    System for importing modules from other psfx files was not working.
    Probably wasn't working for quite some time. Now fixed.

commit be88f4b296
Merge: 0039ff74 7a321f6d
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 18 14:07:19 2023 +0000

    # WARNING: head commit changed in the meantime

    Merge branch 'main' of https://github.com/PAMGuard/PAMGuard into main

commit 7a321f6d95
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 18 13:28:38 2023 +0000

    Revert "Merge branch 'main' of https://github.com/PAMGuard/PAMGuard"

    This reverts commit f52a27ccf2, reversing
    changes made to 4a5c6fe52e.

commit f52a27ccf2
Merge: 4a5c6fe5 f8d2de44
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 18 12:45:53 2023 +0000

    Merge branch 'main' of https://github.com/PAMGuard/PAMGuard

commit 4a5c6fe52e
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 18 12:45:49 2023 +0000

    small fix in histograms

    small fix in histograms to avoid null

commit 25d10d54b4
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun Dec 17 19:28:03 2023 +0000

    Start Tethys Help

commit a761100ba7
Merge: c3edae51 0039ff74
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun Dec 17 12:52:36 2023 +0000

    Merge remote-tracking branch 'origin/main' into Tethys

commit c3edae516b
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun Dec 17 12:52:06 2023 +0000

    Small error handling

commit f8d2de4482
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun Dec 17 12:27:31 2023 +0000

    Settings import (#117)

    * Stop command

    small change so command is available as a constant

    * Lots of small updates to enable opening of a secondary configuration for
    batch processing control.

    * Fix user input bug in viewer

    which created exponential copies of user comments!

    * Adding TAST trigger alarm action

    To be competed when GW provide correct string for interface

    * Echo offline detection

    Fix up affected datablocks for offline echo detection

    * fix module import

    System for importing modules from other psfx files was not working.
    Probably wasn't working for quite some time. Now fixed.

commit 0039ff7422
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun Dec 17 12:19:18 2023 +0000

    fix module import

    System for importing modules from other psfx files was not working.
    Probably wasn't working for quite some time. Now fixed.

commit 2e29e9cd95
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Dec 15 17:49:39 2023 +0000

    Deployment and Detections work

    Big tidy up of Deployment and Detections output. Think it' spretty close
    to a functional system now.

commit 75d349e33c
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 14 18:52:17 2023 +0000

    Echo offline detection

    Fix up affected datablocks for offline echo detection

commit f55311ea36
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 14 18:51:42 2023 +0000

    Adding TAST trigger alarm action

    To be competed when GW provide correct string for interface

commit 760b9769d7
Merge: 4297afdc 951e3116
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 14 12:43:07 2023 +0000

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard.git into main

commit 4297afdc51
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 14 12:42:41 2023 +0000

    Fix user input bug in viewer

    which created exponential copies of user comments!

commit 3059e087ac
Merge: 9a000586 87813746
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 14 12:27:14 2023 +0000

    Merge branch 'Tethys' of C:\Users\dg50\source\repos\PAMGuardTethys into
    Tethys

commit 9a0005861c
Merge: 951e3116 5b649edc
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 14 12:14:44 2023 +0000

    Merge branch 'Tethys' of C:\Users\dg50\source\repos\PAMGuardTethys into
    Tethys

commit 8781374685
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 14 11:57:44 2023 +0000

    Small changes to deployment table

commit ef92e1eea9
Merge: 02ad66db 951e3116
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 14 10:53:46 2023 +0000

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard into main

commit 951e3116a5
Merge: 2dd90f6a b12ccf9c
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 14 10:51:17 2023 +0000

    Merge pull request #48 from PAMGuard/main

    Merge from main

commit b12ccf9c67
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 14 10:50:29 2023 +0000

    Merge with main (#116)

    * Stop command

    small change so command is available as a constant

    * Lots of small updates to enable opening of a secondary configuration for
    batch processing control.

commit 02ad66db3b
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 14 10:33:46 2023 +0000

    User input viewer bug

    PAMGuard was marking multiline comments as changed and then relogging
    them. Led to exponential increase in database size!

commit 03483ded18
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Dec 13 17:31:35 2023 +0000

    Deployment export

    Improved deployment export interface and options.

commit 860d1bec17
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 7 20:08:17 2023 +0000

    Update Calibration export

    Stop repeating hydrophones and add two addresses to Calibrations docs

commit 9c86b41027
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 7 15:10:45 2023 +0000

    Project info dialog

    More wrapping of nilus objects to make a general project info tab in
    PAMGuard. This is global and can share basic project informatin with the
    Tethys module.

commit 7721d7f1c0
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Dec 6 17:35:57 2023 +0000

    Global metadata

    Reorganised how global meta data for a PAMGuard dataset is managed by
    wrapping a nilus deployment object so that PAMGuard settings can
    serialise and unpack the xml version of a nilus Deployment object.

commit bafe93e7f5
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Dec 6 12:20:40 2023 +0000

    SQLLogging revert

    Revert main table definition class used by SQLLogging to
    PamTableDefinition, back from EmptyTableDefinition, to maintain
    compatibility with existing plugin modules.

commit 9939e8aa85
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 4 21:27:00 2023 +0000

    Calibrations Export

    Functional Calibrations export wizard and display

commit 275a53c042
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun Dec 3 18:21:09 2023 +0000

    Calibrations display

    display of calibrations documents + some general tidying up of document
    management and display.

commit 840e6c89a1
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Nov 16 20:36:14 2023 +0000

    R2.02.09d

    Fix matched template classifier import
    fix azigram help file image display

commit 2dd90f6a32
Merge: 58fe0d77 acc806d3
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Nov 15 15:02:50 2023 +0000

    Merge branch 'main' of https://github.com/PAMGuard/PAMGuard into main

commit 58fe0d7754
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Nov 15 15:02:18 2023 +0000

    Lots of small updates to enable opening of a secondary configuration for
    batch processing control.

commit acc806d375
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Nov 15 13:08:02 2023 +0000

    Updated X3 library to 2.2.6

commit a4f484c76c
Merge: 8e60ad2e d7c4c278
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Nov 15 09:44:09 2023 +0000

    Merge branch 'main' of https://github.com/PAMGuard/PAMGuard.git into main

commit 8e60ad2eff
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Nov 15 09:43:39 2023 +0000

    update to array diagnostics and sensor control

commit d7c4c278d8
Author: m2oswald <45486636+m2oswald@users.noreply.github.com>
Date:   Wed Nov 15 09:17:49 2023 +0000

    Added code to Rocca for training/testing classifier (#114)

    * allow Rocca to run without classifiers

    Fixed bug that threw an error if no classifier files were specified in Rocca Params dialog

    * add rocca switch to enable dev mode

    currently only shows/hides extra buttons in the Params dialog, but will
    extend to more options in the future

    * Fix memory issue with RoccaContourDataBlocks not being released for
    garbage collection

    Set RoccaContourDataBlock objects to null and stop PamObserver Timer to
    force release

    * Fix problem tracing whistles in Rocca spectrogram pop-up

    Whistle and raw data were being cleared before the user had time to trace out the whistle, causing PAMGuard to throw an exception.  Both were already being cleared when the pop-up window is closed, so no need to do it here.

    * updated for training/testing classifiers

commit d5f504dcd1
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Nov 10 18:08:31 2023 +0000

    Bearing localiser offline save

    Bug stopping it correctly saving data from the offline task to the
    database fixed.

commit 6cc01fe77a
Merge: 1f8e790a 9fca879c
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Oct 27 10:06:52 2023 +0100

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard into main

commit 9fca879c39
Merge: bff8eeeb 7a44d49e
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Oct 27 10:02:47 2023 +0100

    Merge branch 'main' of https://github.com/PAMGuard/PAMGuard.git into main

commit 7a44d49e27
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Oct 27 09:59:28 2023 +0100

    X3 Version 2.2.3

    Add maven jar files for X3/SUD version 2.2.3

commit bff8eeebc5
Merge: 3da3f31b fa5fe994
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Oct 26 15:50:26 2023 +0100

    Merge branch 'main' of https://github.com/PAMGuard/PAMGuard.git into main

commit fa5fe9943d
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Oct 26 14:44:41 2023 +0100

    update sud file management to more efficiently skip to the correct part
    of a sud file when reading data offline.

commit 1f8e790ae5
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Sep 29 13:43:49 2023 +0100

    Collection enum

    Made an enum for the different collections. More robust than passing the
    names around as strings. Contains functions for converting between the
    collection name and the documents names within those collections.

commit 773f1f542b
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun Sep 24 21:59:15 2023 +0100

    Species map i/o

commit 8257122d14
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Sep 21 18:01:41 2023 +0100

    Log Tethys output and include instrumentid in Deployment queries

commit 4d294b56a8
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Sep 19 16:55:33 2023 +0100

    Click event output

commit 5fe0927c10
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Sep 18 12:49:39 2023 +0100

    Noise logging

commit 415ec87938
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun Sep 17 21:10:23 2023 +0100

    noise output

commit 158eedce8c
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Sep 15 15:15:28 2023 +0100

    Detections output

    more work on detections output.

commit db1cc75bc1
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Sep 13 17:28:47 2023 +0100

    More output

    More changes to Detections output.

commit 85fd84d18a
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Sep 11 21:52:46 2023 +0100

    Fix binned output

    couple of fixes in binned output

commit 65dfb5688b
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Sep 11 17:47:50 2023 +0100

    More on granularity

    Nice format of granularity in display tables.

commit c221d78aa2
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Sep 11 17:07:15 2023 +0100

    Added bin granularity

    binned granularity in place. TODO Encounter granularity.

commit baca001ed8
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Sep 8 16:31:00 2023 +0100

    Param output only if not display

commit 7465243169
Merge: fb00a757 3da3f31b
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Sep 8 13:32:22 2023 +0100

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard into main

commit 3da3f31b33
Merge: dbeaa668 3385935a
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Sep 8 13:29:37 2023 +0100

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard.git into main

commit dbeaa66821
Merge: 1b5454be 60435e56
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Sep 8 13:26:11 2023 +0100

    Merge branch 'main' of https://github.com/PAMGuard/PAMGuard into main

commit 60435e567a
Author: Brian S Miller <93690136+BrianSMiller@users.noreply.github.com>
Date:   Fri Sep 8 21:54:40 2023 +1000

    Fixes issues #111 and fixes #112 (DIFAR module crashes and ability to use Deep Learning Detections in DIFAR module) (#110)

    * Bugfix for OverlayMarks

    Check for a null pointer exception in OverlayMarks that was causing a crash on startup.

    * Bugfix for null pointer in symbol manager

    Fix a bug that I found where the DIFAR module was crashing the symbol manager. Seems that this was due to this subclass of clip generator having a null value for it's uniqueName. I've fixed by checking for null values and assigning a generic symbol when null.

    * DeepLearning detections canGenerateClips=true

    Set flag in DeepLearning detector so that detections are considered 'clips' by Pamguard. This allows them to be processed automatically in the DIFAR Localisation module (and maybe others).

    * DIFAR: bugfix frequency limits for auto-detections

    Fix a bug in DIFAR module where the frequency limits of automated detections were not being set properly by the DIFAR module.

    * DeepLearning - Bugfix to detection duration

    Fix bug in deep learning detector where duration (in samples) was being set to number of samples in a hop instead of the number of samples in a segment.

commit fb00a757cd
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Sep 7 16:58:38 2023 +0100

    Data export

    A few fixes in Detections export.

commit 3688719e25
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Aug 31 17:06:51 2023 +0100

    Working parameter output

    Only just and not complete, but working.

commit 07ced6ae6d
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Aug 29 11:53:40 2023 +0100

    Species info

    Sort out of species info which hopefully now deals with all
    eventualities.

commit 74deebe446
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Aug 8 18:29:45 2023 +0100

    Fixed queries

    Also added internal display of existing docuemtns (so they can be
    deleted)

commit 9018176899
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Jul 20 19:06:42 2023 +0100

    ITIS Codes GUI

    Basic system in place for handling ITIS species codes.

commit 5c969d8889
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jul 19 13:56:39 2023 +0100

    work on species mapping

commit 527aeccbb8
Merge: cd70026c 3385935a
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Jul 3 18:00:53 2023 +0100

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard into
    main

commit cd70026cf8
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Jul 3 17:53:35 2023 +0100

    Starting to map species codes

commit 3385935aec
Merge: 68b2f3bb c3c31c33
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Jul 3 17:48:41 2023 +0100

    Merge pull request #47 from PAMGuard/main

    pull from main

commit 75470b450b
Merge: f3944e35 68b2f3bb
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jun 9 13:01:35 2023 +0100

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard into main

    Conflicts:
    	src/PamModel/PamModel.java

commit f3944e3536
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jun 9 12:56:23 2023 +0100

    Update FolderInputSystem.java

commit 68b2f3bb53
Merge: 1b5454be b0a06300
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jun 9 12:53:30 2023 +0100

    Merge pull request #46 from PAMGuard/main

    get V2.02.08 from main

commit 3df05c3ec6
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon May 29 15:27:21 2023 +0100

    Document export

commit 36da1bcbeb
Merge: 1ea20d80 1b5454be
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon May 29 09:02:48 2023 +0100

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard into main

commit 1b5454be91
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri May 26 10:27:25 2023 +0100

    Stop command

    small change so command is available as a constant

commit d841959171
Merge: f97f967b d350d5a7
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri May 26 09:53:08 2023 +0100

    Merge pull request #45 from PAMGuard/main

    pull from main

commit f97f967b23
Merge: 508ca524 c17208d3
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue May 23 15:46:57 2023 +0100

    Merge pull request #44 from PAMGuard/main

    Map file errors

commit 508ca524e8
Merge: becb24dc db037c6d
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri May 12 15:38:04 2023 +0100

    Merge pull request #43 from PAMGuard/main

    update from main

commit 1ea20d80ed
Merge: 49843b40 becb24dc
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon May 8 15:46:04 2023 +0100

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard into main

commit becb24dcc5
Merge: 2953d82b 29f0bf7e
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon May 8 15:43:58 2023 +0100

    Merge pull request #42 from PAMGuard/main

    X3 updates

commit 49843b405f
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun May 7 20:06:59 2023 +0100

    Some query changes

    Changes in server code required update of some of the json for existing
    queries.

commit 00410d2017
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun May 7 19:00:37 2023 +0100

    Exception handling

    Exception handling and warning messages on Tethys transactions

commit 71c8415bc8
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sat May 6 19:26:04 2023 +0100

    Playing with export options

commit 38b05b13c5
Merge: 8a9719b4 2953d82b
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sat May 6 11:15:48 2023 +0100

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard into main

commit 8a9719b425
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon May 1 18:55:35 2023 +0100

    Tethys working again

    And a bit more playing around with metadata handling for Deploymnet
    documents

commit 379cd61afa
Merge: 4f0f4a6c f74bb5eb
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Apr 24 13:35:51 2023 +0100

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard into main

commit 4f0f4a6c36
Merge: dfb78813 795b32e4
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Apr 13 18:04:38 2023 +0100

    Merge remote-tracking branch 'PAMGuardDGOriginal/main' into main

    Conflicts:
    	src/binaryFileStorage/BinaryStoreProcess.java
    	src/clickDetector/layoutFX/clickClassifiers/SweepClassifierSetPaneFX.java

commit dfb78813ea
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Apr 13 17:41:52 2023 +0100

    Update TethysControl.java

commit dbc8f0c682
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Apr 4 21:02:09 2023 +0100

    Men items to open collections in browser

commit 35fa8270d2
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Apr 4 20:53:14 2023 +0100

    Changes to match server updates

    Deleting now working. am automatically calling a windows curl command to
    disable the cache on the server.

commit faea94205c
Merge: 573785d9 16e8184a
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Sun Apr 2 11:15:19 2023 +0100

    Merge branch 'main' of https://github.com/douggillespie/PAMGuard into main

    Conflicts:
    	src/Array/ArrayDialog.java
    	src/PamModel/PamModel.java
    	src/clickDetector/layoutFX/clickClassifiers/SweepClassifierSetPaneFX.java

commit 573785d98f
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Mar 31 19:07:02 2023 +0100

    GUi Play

    Export wizard for detections

commit 4be259b76b
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Mar 29 20:57:54 2023 +0100

    GUI Play

    Experimenting with GUI components

commit 642f1da873
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Mar 22 20:07:17 2023 +0000

    updated doc names

    Dog names now match their id so it's easier to delete them from Tethys

commit c7ceba1604
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Mar 21 20:05:38 2023 +0000

    GUI Work.

    working on some GUI / control options. Semi functional. Seem to have a
    problem with time zones converting from XML time to millis which need
    sorting.

commit f51a519d82
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Mar 17 21:26:13 2023 +0000

    Start Tethys GUI

commit b344b775ec
Merge: cff6f718 ecf364f9
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Mar 16 16:35:09 2023 +0000

    Merge branch 'main' of https://github.com/douggillespie/PAMGuardTethys

commit cff6f71881
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Mar 16 16:34:03 2023 +0000

    update autoprovider

commit ecf364f999
Merge: 7f680f3e 289b0659
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Thu Mar 16 09:14:11 2023 -0700

    Merge branch 'main' of https://github.com/douggillespie/PAMGuardTethys

commit 7f680f3e20
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Thu Mar 16 09:13:42 2023 -0700

    fixed some deploymentData defaulting

    fixed some deploymentData defaulting

commit 289b065914
Merge: 8c3c0098 140af14c
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Mar 15 23:39:33 2023 +0000

    Merge branch 'main' of https://github.com/douggillespie/PAMGuardTethys

commit 8c3c0098da
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Mar 15 23:38:51 2023 +0000

    work

commit 140af14cba
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Wed Mar 15 16:38:13 2023 -0700

    required field update and post to tethys fxn updates

    fill in required data for deployments/detections and minor tweaks to post to tethys fxn

commit d96ace1ca2
Merge: f15a6daf 27b8456c
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Wed Mar 15 15:05:57 2023 -0700

    Merge branch 'main' of https://github.com/douggillespie/PAMGuardTethys

commit f15a6dafa6
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Wed Mar 15 15:05:33 2023 -0700

    TethysExportControl

    add post to tethys code in TethysExportControl

commit 27b8456c5a
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Mar 15 22:04:13 2023 +0000

    More detection work

commit e8e947b91f
Merge: ceefa618 4876899b
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Wed Mar 15 12:38:33 2023 -0700

    Merge branch 'main' of https://github.com/douggillespie/PAMGuardTethys

commit ceefa6188c
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Wed Mar 15 12:38:29 2023 -0700

    Update TethysExporter.java

    updated export code to add namespace to the xml produced

commit 4876899b54
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Mar 15 18:13:11 2023 +0000

    Detections Document ready to go

commit f97247f148
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Mar 15 17:21:35 2023 +0000

    Detections output

    Working towards output of Detections ...

commit 98ce0ff9d2
Merge: 68b7d08b 3991a871
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Tue Mar 14 14:16:02 2023 -0700

    Merge branch 'main' of https://github.com/douggillespie/PAMGuardTethys

commit 68b7d08bc6
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Tue Mar 14 14:14:22 2023 -0700

    Update TethysExporter.java

    minor tweak

commit 3991a87102
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Mar 14 21:13:48 2023 +0000

    up[dated exporter

commit 0fad7c6cfa
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Mar 14 17:34:45 2023 +0000

    Deployment doc

    Work on deployment document population

commit 103c050d0c
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Tue Mar 14 17:28:13 2023 +0000

    Trying to Merge with KB Changes

commit 2dd870956a
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Tue Mar 14 08:40:49 2023 -0700

    Update TethysExporter.java

    small fix

commit 8842166f43
Merge: 799c7b21 501c0ec2
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Tue Mar 14 08:38:08 2023 -0700

    Merge branch 'main' of https://github.com/douggillespie/PAMGuardTethys

commit 799c7b218e
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Mon Mar 13 17:27:39 2023 -0700

    Update TethysExporter.java

    file importer

commit 501c0ec292
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Mar 13 21:44:19 2023 +0000

    Deployment positions

commit 98cf904830
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Mar 13 20:45:51 2023 +0000

    first very incomplete deployment doc

commit 456f9102db
Merge: 534765d1 7d69992d
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Mar 13 18:36:36 2023 +0000

    Merge branch 'main' of https://github.com/douggillespie/PAMGuardTethys

commit 534765d1cc
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Mar 13 18:35:25 2023 +0000

    notes

commit 7d69992d44
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Mon Mar 13 11:33:46 2023 -0700

    Update TethysExporter.java

    testing

commit 24c7baab6e
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Mar 13 18:31:04 2023 +0000

    Notes

commit 43ea481c3f
Author: kbolaughlin <kolaughl@ucsd.edu>
Date:   Mon Mar 13 11:05:10 2023 -0700

    adding deployment recovery pair

commit bfed9cfa00
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Feb 23 13:37:53 2023 +0000

    Update to Nilus 3

commit 9c10af43bc
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Feb 22 10:51:04 2023 +0000

    Added code to find acquisition settings

    This is most of the data needed for TEthys

commit f12be978aa
Merge: b2e6f85f 5b649edc
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Feb 1 10:23:39 2023 +0000

    Merge pull request #2 from douggillespie/Tethys

    Merging Tethys branch into main

commit 5b649edc19
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 27 15:13:30 2023 +0000

    Comments

    Added a couple of comments to help SDSU folk get off the ground

commit b2e6f85faf
Merge: 738c9ab6 1c11e3da
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 27 14:34:12 2023 +0000

    Merge pull request #1 from douggillespie/Tethys

    Tethys

commit 1c11e3da15
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Fri Jan 27 11:11:02 2023 +0000

    DBXM Export

    A few functions to help find data.

commit f02001a6fc
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Jan 25 16:40:03 2023 +0000

    Changes for Tethys integration

commit 5e6cd42eea
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Thu Dec 15 18:21:17 2022 +0000

    Tethys Export

    A bit of fun writing some outline functions to export data to Tethys.

commit 48716cb366
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Mon Dec 12 17:04:20 2022 +0000

    XML Settings

    Added a new log of XML settings / Effort for each module to the
    database. Had to make a lot of changes so that the base table in
    SQLLogging is of type EmptyTableDefinition, not PamTableDefinition.
    Needs a lot of testing and may break plugins using logging features.

commit 29230a5c5f
Author: Douglas Gillespie <50671166+douggillespie@users.noreply.github.com>
Date:   Wed Nov 23 14:56:25 2022 +0000

    Better XML

    Improving XML data for each detector
This commit is contained in:
Jamie Mac 2024-03-11 14:00:32 +00:00
parent 7ddf4d6eb9
commit 3a74152beb
592 changed files with 25531 additions and 1070 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>PamGuard Main DG</name>
<name>PamGuard Main Tethys</name>
<comment></comment>
<projects>
</projects>

View File

@ -324,9 +324,8 @@ href="http://www.gnu.org/licenses/gpl-3.0-standalone.html">http://www.gnu.org/li
<h1><a name="_Toc444450028"></a><a name="_Toc444450392"></a>INSTALLATION </h1>
<p class=MsoNormal>The latest version of PAMGuard has been tested on 64 bit
Windows 10. We expect it to work without problems on 64 bit versions of Windows
8 and probably 7. Some testing has been undertaken on Windows 11 and nothing
unexpected has been noted. </p>
Windows 10 and Windows 11. We expect it to work without problems on 64 bit
versions of Windows 8 and probably 7. </p>
<p class=MsoNormal>On Windows, download and run the Windows installer.</p>
@ -372,23 +371,27 @@ size for the JVM being used to run Pamguard i.e. how much memory it gets to
use. The default max size usually being too low.</p>
<p class=MsoNormal>The -Djava.library.path=lib64 tells the JVM that it should
look in the folder called &quot;lib64&quot; for the required shared libraries (change
to <em><span style='font-family:"Calibri",sans-serif'>lib</span></em> for the
32 bit version).</p>
look in the folder called &quot;lib64&quot; for the required shared libraries
(change to <em><span style='font-family:"Calibri",sans-serif'>lib</span></em>
for the 32 bit version).</p>
<p class=MsoNormal>For &quot;Mixed&quot; and &quot;Viewer&quot; modes just add
a &quot;-m&quot; or &quot;-v&quot; to the list of java arguments. On Windows
just run the appropriately named executable (e.g. PamguardBeta_MixedMode.exe or
PamguardBeta_ViewerMode.exe):</p>
<p class=MsoNormal><em><span style='font-family:"Calibri",sans-serif'>java -Xms384m
-Xmx4096m -Djava.library.path=lib64 -jar PamguardBeta_xxxxxx.jar -v</span></em></p>
<p class=MsoNormal><em><span style='font-family:"Calibri",sans-serif'>java
-Xms384m -Xmx4096m -Djava.library.path=lib64 -jar PamguardBeta_xxxxxx.jar -v</span></em></p>
<p class=MsoNormal><em><span style='font-family:"Calibri",sans-serif'>&nbsp;</span></em></p>
<h1><a name="_LATEST_VERSION_2.02.03"></a><a name="_VERSION_2.02.07_January"></a><em><span
style='font-size:12.0pt;font-family:"Cambria",serif;font-style:normal'><a
href="#_Version_2.02.09_June">Latest Version 2.02.09 June 2023</a></span></em></h1>
<h1><a name="_LATEST_VERSION_2.02.03"></a><a name="_VERSION_2.02.07_January"></a><a
name="_Latest_Version_2.02.10"></a><em><span style='font-size:12.0pt;
font-family:"Cambria",serif;font-style:normal'><a
href="#_Version_2.02.10_January">Latest Version 2.02.10 January 2024</a></span></em></h1>
<h1><em><span style='font-size:12.0pt;font-family:"Cambria",serif;font-style:
normal'><a href="#_Version_2.02.09_June">Version 2.02.09 June 2023</a></span></em></h1>
<h1><em><span style='font-size:12.0pt;font-family:"Cambria",serif;font-style:
normal'><a href="#_Version_2.02.08_May">Version 2.02.08 May 2023</a></span></em></h1>
@ -457,8 +460,86 @@ Version 2.00.10 June 2017</a></span></h1>
<h1><a name="_Latest_Version_2.02.03_1"></a><a name="_Latest_Version_2.02.05"></a><a
name="_Latest_Version_2.02.06"></a><a name="_Latest_Version_2.02.07"></a><a
name="_Latest_Version_2.02.08"></a><a name="_Version_2.02.09_June"></a><span
lang=EN-US>Version 2.02.09 June 2023</span></h1>
name="_Latest_Version_2.02.08"></a><a name="_Version_2.02.09_June"></a><a
name="_Version_2.02.10_January"></a>Version 2.02.10 January 2024</h1>
<h2><span lang=EN-US>New Features</span></h2>
<p class=MsoNormal><b><span lang=EN-US>Importing modules</span></b><span
lang=EN-US> from other configurations: New options from file menu allowing
import of specific modules, or module settings from other configurations. E.g.
if you had three similar configurations and had set one of them up with a new
detector, or got the click classifier settings set up just right in one of
those configurations, you can import the additional modules or the click
detector settings easily into the other configurations. </span></p>
<p class=MsoNormal><b><span lang=EN-US>Improved SUD (soundtrap compressed
files) file performance</span></b><span lang=EN-US> when scrolling through
audio data in Viewer mode. </span></p>
<p class=MsoNormal><b><span lang=EN-US>Viewer Launch</span></b><span
lang=EN-US> by right clicking on sqlite database and selecting “open with /
Pamguard ViewerMode” launcher menu option.</span></p>
<h2><span lang=EN-US>Bug Fixes</span></h2>
<p class=MsoNormal><b><span lang=EN-US>Logger Forms</span></b></p>
<p class=MsoNormal><span lang=EN-US>Boolean (logical true/false, yes/no) data
were not showing correctly in Viewer mode. Now fixed</span></p>
<p class=MsoNormal><span lang=EN-US>Data selectors for plotting on map were not
working, also fixed</span></p>
<p class=MsoNormal><span lang=EN-US>Bearing localizer running offline was not
correctly saving updated bearings to the database. Now fixed. </span></p>
<p class=MsoNormal><b><span lang=EN-US>ROCCA Classifier fixes</span></b></p>
<p class=MsoNormal><span lang=EN-US>Allow Rocca to run without classifiers:
Fixed bug that threw an error if no classifier files were &nbsp;specified in
Rocca Params dialog</span></p>
<p class=MsoNormal><span lang=EN-US>Fix memory issue with
RoccaContourDataBlocks not being released for garbage collection</span></p>
<p class=MsoNormal><span lang=EN-US>Set RoccaContourDataBlock objects to null
and stop PamObserver Timer to</span></p>
<p class=MsoNormal><span lang=EN-US>force release</span></p>
<p class=MsoNormal><span lang=EN-US>Fix problem tracing whistles in Rocca
spectrogram pop-up: Whistle and raw data were being cleared before the user had
time to trace out the whistle, causing PAMGuard to throw an exception.&nbsp;
Both were already being cleared when the pop-up window is closed, so no need to
do it here.</span></p>
<p class=MsoNormal><b><span lang=EN-US>DIFAR Module</span></b><span lang=EN-US>:
Bug crashing the module with null pointer errors fixed.</span></p>
<p class=MsoNormal><b><span lang=EN-US>Whistle Detector</span></b><span
lang=EN-US>: Fixed bug which caused the detector to slow to almost zero speed
when large complex sounds with many branches were detected. </span></p>
<p class=MsoNormal><b><span lang=EN-US>Click Detector Offline Event Marking</span></b><span
lang=EN-US>: Fixed problem of events not being correctly deleted and also of
clicks not being correctly reassigned to different events. </span></p>
<p class=MsoNormal><b><span lang=EN-US>Screen Position</span></b><span
lang=EN-US>: When using multiple monitors, if you move a configuration to a
computer with a different monitor layout, the GUI should work out if its
opening on a screen area which no longer exists and move itself onto the
primary monitor. </span></p>
<p class=MsoNormal><b><span lang=EN-US>File Folder Processing</span></b><span
lang=EN-US>: Previous version had a bug which caused files to not always be
sorted into the correct order for processing. This caused some instability in
some detectors, causing memory leaks when new data arrived with time stamps
earlier than already processed data in memory. This is now fixed files are ow
correctly sorted alphabetically </span>by file name, i.e. not including the
name of the folder containing the files.</p>
<h1><span lang=EN-US>Version 2.02.09 June 2023</span></h1>
<h2><span lang=EN-US>Bug Fixes</span></h2>
@ -484,8 +565,8 @@ bearings, the localizer was not correctly loading required raw or FFT data to
input to the cross correlation algorithm. This is now fixed so that you can
reprocess bearings in viewer mode. </span></p>
<p class=MsoNormal><span lang=EN-US>Map files: Added additional exception handlers
to handle corrupt map files. </span></p>
<p class=MsoNormal><span lang=EN-US>Map files: Added additional exception
handlers to handle corrupt map files. </span></p>
<h2><span lang=EN-US>New Features</span></h2>
@ -508,16 +589,16 @@ the first two characters of the string name may be. </span></p>
<h2><span lang=EN-US>Bug Fixes</span></h2>
<p class=MsoNormal><span lang=EN-US>Use of localization sensor and orientation data
for static hydrophones had a bug whereby it would continually forget angle
offsets applied to static hydrophones in viewer mode. This is now fixed. </span></p>
<p class=MsoNormal><span lang=EN-US>Use of localization sensor and orientation
data for static hydrophones had a bug whereby it would continually forget
angle offsets applied to static hydrophones in viewer mode. This is now fixed. </span></p>
<p class=MsoNormal><span lang=EN-US>Click tool bar: Correctly shows event
selection options even if no species classification options are in place. </span></p>
<p class=MsoNormal><span lang=EN-US>Fixed Landmarks: Earlier versions were
losing these every time PAMGuard started or new data were loaded in viewer
mode. Now fixed. </span></p>
<p class=MsoNormal><span lang=EN-US>Fixed Landmarks: Earlier versions were losing
these every time PAMGuard started or new data were loaded in viewer mode. Now
fixed. </span></p>
<p class=MsoNormal><span lang=EN-US>ROCCA: Fixed (another) memory leak which
caused PAMGuard to crash when processing large data sets with the ROCCA
@ -563,10 +644,10 @@ whistle classification module.</span></p>
<p class=MsoNormal><span lang=EN-US>SoundTrap SUD file reading. If youre using
SoundTrap autonomous recorders from Ocean Instruments, you no longer need to
decompress the SoundTrap files prior to processing. This will save time and a
lot of disk space. Extraction of clicks from the inbuilt SoundTrap Click detector
can also happen while processing SUD file data with other detectors, thereby
streamlining the whole processing chain. Read the online Help for details.
&nbsp;&nbsp;</span></p>
lot of disk space. Extraction of clicks from the inbuilt SoundTrap Click
detector can also happen while processing SUD file data with other detectors,
thereby streamlining the whole processing chain. Read the online Help for
details. &nbsp;&nbsp;</span></p>
<h1><span lang=EN-US>Version 2.02.05 October 2022</span></h1>
@ -624,7 +705,7 @@ audio files. </span></p>
<h2><span lang=EN-US>Bug Fixes</span></h2>
<p class=MsoNormal><span lang=EN-US>Soundtrap DWV import. Will now generate
binary files even if DWV file doesnÂt exist (which is correct behavior in
binary files even if DWV file doesnt exist (which is correct behavior in
quiet conditions when no clicks were detected). </span></p>
<p class=MsoNormal><span lang=EN-US>Spectrogram. Changes to stop occasional
@ -659,8 +740,8 @@ running in real time. Added template names based on file names. </p>
<p class=MsoNormal>#13 Merging files when offline processing file folders: Had
an error introduced in last release which caused it to fail to recognise gaps
between files, meaning that some output data (i.e. after a gap) would have an
incorrect time stamp. This did not affect data if the ÂÂmerge contiguous
filesÃÂ option was not selected. </p>
incorrect time stamp. This did not affect data if the merge contiguous files
option was not selected. </p>
<p class=MsoNormal>#14 Logger forms data were not plotting correctly. This was
due to the required data selection functions not being fully implemented. This
@ -669,9 +750,9 @@ selections from drop down lists within any form.</p>
<p class=MsoNormal>&nbsp;</p>
<p class=MsoNormal>Note that updates have also been made to the Matlab interface
to PAMGuard binary files, which has now also been migrated to GitHub at <a
href="https://github.com/PAMGuard/PAMGuardMatlab">https://github.com/PAMGuard/PAMGuardMatlab</a>.
<p class=MsoNormal>Note that updates have also been made to the Matlab
interface to PAMGuard binary files, which has now also been migrated to GitHub
at <a href="https://github.com/PAMGuard/PAMGuardMatlab">https://github.com/PAMGuard/PAMGuardMatlab</a>.
</p>
<h1>&nbsp;</h1>
@ -686,9 +767,8 @@ the TF FX display to crash if no data were displayed.</span></p>
<p class=MsoNormal><span lang=EN-US>See major release notes for V 2.02.01
below. </span></p>
<p class=MsoNormal><span lang=EN-US>Bug 495: TD FX display throws
NullPointerException if user has removed all data units and then moves mouse
over display area.</span></p>
<p class=MsoNormal><span lang=EN-US>Bug 495: TD FX display throws NullPointerException
if user has removed all data units and then moves mouse over display area.</span></p>
<h1><a name="_Latest_Version_2.02.01"></a><span lang=EN-US>Version 2.02.01
October 2021</span></h1>
@ -711,11 +791,11 @@ font-family:"Times New Roman",serif'>&nbsp;</span></p>
<h2>File Format Change</h2>
<p class=MsoNormal>Changes have been made to the binary file format to support
the output of additional noise outputs for certain detectors (See below).
Binary files created with this version will not be compatible with earlier
versions 2.01.### and below. This version will read and may convert earlier
format binary files.</p>
<p class=MsoNormal>Changes have been made to the binary file format to support the
output of additional noise outputs for certain detectors (See below). Binary
files created with this version will not be compatible with earlier versions
2.01.### and below. This version will read and may convert earlier format
binary files.</p>
<p class=MsoNormal style='margin-bottom:0cm'><span style='font-size:12.0pt;
font-family:"Times New Roman",serif'>&nbsp;</span></p>
@ -733,10 +813,10 @@ href="http://www.pamguard.org/downloads.php?cat_id=3">here</a>.</p>
<p class=MsoNormal><b><span lang=EN-US>Detection Group Localiser</span></b><span
lang=EN-US> </span></p>
<p class=MsoNormal>This module has been renamed “Detection Grouper”, so
as to avoid confusion with the Group 3D localizer. This is because the
Detection Grouper is more for organizing data into groups to be localized than
it is for doing localization.</p>
<p class=MsoNormal>This module has been renamed “Detection Grouper”, so as to
avoid confusion with the Group 3D localizer. This is because the Detection
Grouper is more for organizing data into groups to be localized than it is for
doing localization.</p>
<p class=MsoNormal><b><span lang=EN-US>Minor Bug Fixes</span></b><span
lang=EN-US> </span></p>
@ -791,9 +871,9 @@ lang=EN-US> </span>Allow Clip Generator to create both a binary record and a
wav file </p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>5. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
Implemented a Backup Manager for backing up multiple types of data to multiple
locations] </p>
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>Implemented a Backup Manager for backing up multiple types
of data to multiple locations] </p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>6. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
@ -834,8 +914,8 @@ lang=EN-US> </span>Extend the Hyperbolic Localiser to handle 2D planar arrays
(previously limited to 3D volumetric arrays) </p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>14. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
new CPOD features </p>
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>new CPOD features </p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>15. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
@ -843,28 +923,29 @@ lang=EN-US> </span>Better interpolation of data by the Decimator when
decimating/upsampling by a non-integer amount </p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>16. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
Noise Level Outputs - as an aid to performance diagnosis, some detectors
(currently the GPL, Click Detector and Whistle and Moan Detector) are
outputting additional noise metrics to their binary output files. These can be
read with the <a href="https://sourceforge.net/projects/pamguard/files/Matlab/">PAMGuard
Matlab library</a> and used to diagnose system performance in varying noise conditions.
Improved displays within PAMGuard for these noise metrics will be included in a
future release. </p>
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>Noise Level Outputs - as an aid to performance diagnosis,
some detectors (currently the GPL, Click Detector and Whistle and Moan
Detector) are outputting additional noise metrics to their binary output files.
These can be read with the <a
href="https://sourceforge.net/projects/pamguard/files/Matlab/">PAMGuard Matlab
library</a> and used to diagnose system performance in varying noise
conditions. Improved displays within PAMGuard for these noise metrics will be
included in a future release. </p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>17. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>An implementation of the Generalized Power Law Detector,
developed by Tyler Helble ([Helble et al., ÂÂA generalized power-law detection
algorithm for humpback whale vocalizationsÂÂ, The Journal of the Acoustical
Society of America, vol. 131, no. 4, pp. 2682ÂÂ2699, 2012) is now available.
For details, see the online help </p>
developed by Tyler Helble ([Helble et al., A generalized power-law detection
algorithm for humpback whale vocalizations, The Journal of the Acoustical
Society of America, vol. 131, no. 4, pp. 26822699, 2012) is now available. For
details, see the online help </p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>18. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
A Deep Learning module for sound classification is now available. This allows
users to deploy a large variety of deep learning models natively in PAMGuard.
For details, see the <a
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>A Deep Learning module for sound classification is now
available. This allows users to deploy a large variety of deep learning models
natively in PAMGuard. For details, see the <a
href="https://github.com/macster110/PAMGuard_DeepLearningSegmenter/blob/master/deep_learning_help.md">online
help</a>. </p>
@ -1123,8 +1204,8 @@ lang=EN-US> </span>Add option to alarm module to attach screenshots of all
frames to email alerts. </p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>7. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
Add Beamformer and Bearing Localiser modules </p>
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>Add Beamformer and Bearing Localiser modules </p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>8. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
@ -1205,8 +1286,8 @@ lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nb
lang=EN-US> </span>Bug 437. Right whale detector crashing if no input was set.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>6. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
Bug 438. Text not showing in tabs in Night colour mode.</p>
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>Bug 438. Text not showing in tabs in Night colour mode.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>7. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
@ -1218,8 +1299,8 @@ lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nb
Bug 440. Measurement Computing Cards not enumerating properly.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>9. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
Bug 441. Plot coordinate calculations incorrect in PamAxis.</p>
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>Bug 441. Plot coordinate calculations incorrect in PamAxis.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>10. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
@ -1232,9 +1313,9 @@ lang=EN-US> </span>Bug 443. NI playback crashing immediately if a device is not
present.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>12. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
Bug 444. Bug in data selector which caused it to mess up history of recent psf
files.</p>
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>Bug 444. Bug in data selector which caused it to mess up
history of recent psf files.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>13. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
@ -1247,9 +1328,9 @@ Bug 446. Multiple PamDataBlocks with same name turn on/off together in
Spectrogram display.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>15. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
Bug 447. Viewer mode throws exception when trying to load beamformer
localisations</p>
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>Bug 447. Viewer mode throws exception when trying to load
beamformer localisations</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>16. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
@ -1374,8 +1455,8 @@ lang=EN-US> </span>Bug 431. Error when trying to mark section of spectrogram to
send to Bearing Calculator module</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>6. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
Bug 432. MySQL database interface - connection problems</p>
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>Bug 432. MySQL database interface - connection problems</p>
<p class=MsoNormal><b><span lang=EN-US>Upgrades</span></b></p>
@ -1479,8 +1560,8 @@ Upgrades to the Group Localiser, including better error estimation.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>2. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>Click Train Detector upgrades, including ability to import time
chunks from csv file for batch processing.</p>
lang=EN-US> </span>Click Train Detector upgrades, including ability to import
time chunks from csv file for batch processing.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>3. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
@ -1502,8 +1583,8 @@ lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nb
New Analog Array Sensors module, to read data from 3-axis accelerometers.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>6. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
Send Email option added to Alarm module.</p>
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>Send Email option added to Alarm module.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>7. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
@ -1625,8 +1706,8 @@ with installation and use of this version.</span></p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>1. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Bug 338. Problem displaying coastlines and bathymetric contours around
the dateline (+/- 180 longitude) in the map.</p>
</span>Bug 338. Problem displaying coastlines and bathymetric contours around the
dateline (+/- 180 longitude) in the map.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>2. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
@ -1864,17 +1945,17 @@ interface when importing Soundtrap data. Also changed the default date/time
format to ISO8601 standard.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>2. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
A number of upgrades and fixes to the Localiser algorithms, including expanding
to work with whistles.</p>
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>A number of upgrades and fixes to the Localiser algorithms,
including expanding to work with whistles.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>3. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
Added option to export all settings and parameters as an XML-formatted file. Note
that this required changes to the structure of the Array Manager, and as such
any settings (psf) files created with this version of Pamguard cannot be used
in older versions. Older psf files can be loaded with this version, but will be
converted.</p>
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>Added option to export all settings and parameters as an
XML-formatted file. Note that this required changes to the structure of the
Array Manager, and as such any settings (psf) files created with this version
of Pamguard cannot be used in older versions. Older psf files can be loaded
with this version, but will be converted.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>4. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
@ -1948,11 +2029,11 @@ trying to classify a boxed whistle</p>
<p class=MsoNormal><b><span lang=EN-US>Upgrades</span></b></p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>1. </span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
During conversion from Core to Beta versions, if there are any problems
matching database units to binary store units the UID values will now be set to
negative numbers instead of leaving them null. The user is warned about this
and encouraged to manually fix the database.</p>
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span
lang=EN-US> </span>During conversion from Core to Beta versions, if there are
any problems matching database units to binary store units the UID values will
now be set to negative numbers instead of leaving them null. The user is warned
about this and encouraged to manually fix the database.</p>
<!-- ************************************************************************************************************************** -->
@ -2126,26 +2207,26 @@ the PAMGuard Viewer the older data will be converted to the new format (see
below for details).</span></p>
<p class=MsoNormal><span lang=EN-US>The most significant change in the binary
file format is the addition of a Unique Data Identifier (UID) to each unit of data.
This is intended to aid in offline analysis by making it easier for the user to
link what they are seeing on different PAMGuard displays and also to link with
any data post processed in Matlab or other custom analysis software. UIDÃÂs
are also added to PAMGuard database tables. </span></p>
file format is the addition of a Unique Data Identifier (UID) to each unit of
data. This is intended to aid in offline analysis by making it easier for the
user to link what they are seeing on different PAMGuard displays and also to
link with any data post processed in Matlab or other custom analysis software.
UIDs are also added to PAMGuard database tables. </span></p>
<h4><span lang=EN-US>Converting Old Data</span></h4>
<p class=MsoNormal><span lang=EN-US>If old data are opened with the PAMGuard
viewer they will automatically be converted. For safety, the original binary
files will not be overwritten and the new data will be placed in a new folder
on your computer with the same path as the old data, but suffixed with
ÃÂ_WithUIDÃÂ, e.g. if your binary data were previously stored in the folder
on your computer with the same path as the old data, but suffixed with _WithUID,
e.g. if your binary data were previously stored in the folder
C:\MySurvey\binarydata the new data will be written to
C:\MySurvey\binarydata_WithUID. </span></p>
<p class=MsoNormal><span lang=EN-US>The additional UID column will be added to
all database tables and populated with unique values. For data which are stored
in both the binary files and in database tables, the same UIDÂÂs will be used
in both data stores. </span></p>
in both the binary files and in database tables, the same UIDs will be used in
both data stores. </span></p>
<h3><span lang=EN-US>New Displays</span></h3>
@ -2214,8 +2295,8 @@ Hawaii/Temperate Pacific/North Atlantic datasets. This has been corrected.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>2.</span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Bug 320. Pamguard stopped reading Click Detector Event data from
database when target motion analysis information was encountered. Corrected.</p>
</span>Bug 320. Pamguard stopped reading Click Detector Event data from database
when target motion analysis information was encountered. Corrected.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>3.</span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
@ -2236,8 +2317,8 @@ lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nb
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>3.</span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Rocca Module: added StartHr, ProportionWhists and ProportionClicks parameters
to Event classifier</p>
</span>Rocca Module: added StartHr, ProportionWhists and ProportionClicks
parameters to Event classifier</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>4.</span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
@ -2379,19 +2460,19 @@ November 2016</span></h1>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Bug 303. Some ASIO sound cards not working with either ASIO system in PAMGuard.
For the PAMGuard ASIO system, this was due to a data format used by some sound
cards never being properly implemented. For the “New ASIO system” which
is based on jAsioHost, the unpacking of that format contained a bug which
returned incorrect numbers, so data were swamped with noise. Both systems are
now fixed. By preference, users should use the PAMGuard ASIO system since the
JAsioHost based system seems to drop samples when many channels are running at
high sample rate. </span></p>
cards never being properly implemented. For the “New ASIO system” which is
based on jAsioHost, the unpacking of that format contained a bug which returned
incorrect numbers, so data were swamped with noise. Both systems are now fixed.
By preference, users should use the PAMGuard ASIO system since the JAsioHost
based system seems to drop samples when many channels are running at high
sample rate. </span></p>
<p class=MsoListParagraph style='text-indent:-18.0pt'>2.<span style='font-size-adjust: none;
font-stretch: normal'><span style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span lang=EN-US>Bug 305. Date and Time not being correctly extracted
from wav files created using SoundTrap recorders. Fixed by correctly finding
and unpacking information in the accompanying xml log files that come with
SoundTrap files. </span></p>
</span></span><span lang=EN-US>Bug 305. Date and Time not being correctly
extracted from wav files created using SoundTrap recorders. Fixed by correctly
finding and unpacking information in the accompanying xml log files that come
with SoundTrap files. </span></p>
<h1><a name="_Latest_Version_1.15.06"></a><span lang=EN-US>Version 1.15.06
November 2016</span></h1>
@ -2671,8 +2752,8 @@ being imported into the new database. Problem 2 was that indexing of imported
click events in the new database was incorrect. Both these issues have now been
fixed. </span></p>
<h1><a name="_Latest_Version_1.15.02"></a><span lang=EN-US>Version 1.15.02
March 2016</span></h1>
<h1><a name="_Latest_Version_1.15.02"></a><span lang=EN-US>Version 1.15.02 March
2016</span></h1>
<p class=MsoNormal>A number of small bug fixes following release of 1.15.00.</p>
@ -2749,8 +2830,8 @@ same click multiple times</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>1.</span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span lang=EN-US>Bug 253. Database import fails when Access database contains
queries. Fixed.</span></p>
</span><span lang=EN-US>Bug 253. Database import fails when Access database
contains queries. Fixed.</span></p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>2.</span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
@ -2824,13 +2905,13 @@ for details. </span></p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>3.</span><span
lang=EN-US style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span lang=EN-US>GPS Loading into PAMGuard Viewer. This has been
modified so that the rules governing GPS data collection and storage also apply
when loading data from the database. For instance, if you've stored all GPS
data, you've probably got a record every second in the database which can
create memory overflows if you try to load a lot of data in the viewer. You can
now tell PAMGuard to only load a data point every n seconds which will reduce
the number of points loaded. Useful when making large scale overview maps of a
</span><span lang=EN-US>GPS Loading into PAMGuard Viewer. This has been modified
so that the rules governing GPS data collection and storage also apply when
loading data from the database. For instance, if you've stored all GPS data,
you've probably got a record every second in the database which can create
memory overflows if you try to load a lot of data in the viewer. You can now
tell PAMGuard to only load a data point every n seconds which will reduce the
number of points loaded. Useful when making large scale overview maps of a
survey. </span></p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span lang=EN-US>4.</span><span
@ -3129,9 +3210,8 @@ to read on a time. Fixed</p>
<p class=MsoNormal><i>Menu Layout</i></p>
<p class=MsoNormal>The PAMGuard menus have been rearranged into a more
intuitive grouping which we believe will help users find functionality more
easily. </p>
<p class=MsoNormal>The PAMGuard menus have been rearranged into a more intuitive
grouping which we believe will help users find functionality more easily. </p>
<p class=MsoNormal>'Detection' menu has been renamed to 'Settings' since many
menu items within this menu were not directly to do with 'Detection'.</p>
@ -3197,8 +3277,8 @@ whistles as well. </p>
<p class=MsoNormal>This module, funded by NOAA for the South West Fisheries
Science Centre (SWFSC), measures pitch and roll from analogue accelerometer
sensors in a hydrophone. Data are fed real time into the updated hydrophone
array manager in order that bearings from a tetrahedral tracking array are correctly
calculated in real world coordinates. </p>
array manager in order that bearings from a tetrahedral tracking array are
correctly calculated in real world coordinates. </p>
<p class=MsoNormal><i>Wild ArcGIS Interface</i> (Maps and Mapping group)</p>
@ -3208,12 +3288,12 @@ marine mammal survey package. See online help for details. </p>
<p class=MsoNormal><i>Alarms</i> (Utilities Group)</p>
<p class=MsoNormal>This is a general system of visual and audio alarms developed
by Doug Gillespie for use on a variety of projects. The alarms can be coupled
to any module or detector in PAMGuard. Where appropriate, modules can control
which of their data will cause an alarm action (e.g. in the Click detector you
can set which types of classified click will fire the alarm). See online help
for details. &nbsp;</p>
<p class=MsoNormal>This is a general system of visual and audio alarms
developed by Doug Gillespie for use on a variety of projects. The alarms can be
coupled to any module or detector in PAMGuard. Where appropriate, modules can
control which of their data will cause an alarm action (e.g. in the Click
detector you can set which types of classified click will fire the alarm). See
online help for details. &nbsp;</p>
<p class=MsoNormal><i>Noise Band Monitor</i> (Sound Processing Group)</p>
@ -3222,9 +3302,9 @@ of third octave noise bands. See online help for details. </p>
<p class=MsoNormal><i>Filtered Noise Measurement</i> (Sound Processing Group)</p>
<p class=MsoNormal>This module, developed by Douglas Gillespie, measures noise
levels in a single frequency band using a variety of filter functions. See
online help for details. </p>
<p class=MsoNormal>This module, developed by Douglas Gillespie, measures noise levels
in a single frequency band using a variety of filter functions. See online help
for details. </p>
<p class=MsoNormal><i>Envelope Tracing</i> (Beta Only, Sound Processing Group)</p>
@ -3260,11 +3340,10 @@ different. Details are available in the online help. </p>
<p class=MsoNormal><i>FLAC File Support</i></p>
<p class=MsoNormal>Can now read raw audio data direct from FLAC files. <a
href="http://en.wikipedia.org/wiki/FLAC">FLAC</a> is a lossless compression
algorithm for audio data. Files, or folders of files are accessed in the same way
as WAV and AIFF files in the Sound Acquisition module. In a future release we
also hope to provide support for writing FLAC files from the sound recorder
module. </p>
href="http://en.wikipedia.org/wiki/FLAC">FLAC</a> is a lossless compression algorithm
for audio data. Files, or folders of files are accessed in the same way as WAV
and AIFF files in the Sound Acquisition module. In a future release we also
hope to provide support for writing FLAC files from the sound recorder module. </p>
<p class=MsoNormal><i>Sound Recorder Module</i></p>
@ -3307,8 +3386,9 @@ shaped Finite Impulse Response filters (see online help for details). </p>
<p class=MsoNormal><i>Radar Display</i></p>
<p class=MsoNormal>Can now show bearings relative to true North OR the vessel heading.
Also has the option of only showing certain types of click and whistle.</p>
<p class=MsoNormal>Can now show bearings relative to true North OR the vessel
heading. Also has the option of only showing certain types of click and
whistle.</p>
<p class=MsoNormal><b>Bug Fixes</b></p>
@ -3387,8 +3467,8 @@ survey software package.</p>
<p class=MsoNormal style='margin-left:36.0pt'><i>Core Functionality</i></p>
<p class=MsoNormal style='margin-left:36.0pt'>New storage options have been implemented
which give the user greater control of where data are stored. </p>
<p class=MsoNormal style='margin-left:36.0pt'>New storage options have been
implemented which give the user greater control of where data are stored. </p>
<p class=MsoNormal style='margin-left:36.0pt'>Modules have been arranged into
different groups in the configuration menus and tool tip texts have been added
@ -3475,8 +3555,8 @@ inter-detection interval.</p>
margin-left:36.0pt'>&nbsp;</p>
<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:0cm;
margin-left:36.0pt'>Target Motion Analysis: Updated target motion analysis module
so that it works in three (as opposed to two) dimensions.</p>
margin-left:36.0pt'>Target Motion Analysis: Updated target motion analysis
module so that it works in three (as opposed to two) dimensions.</p>
<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:0cm;
margin-left:36.0pt'>&nbsp;</p>
@ -3619,8 +3699,8 @@ Symbol'>'</span><span style='font-size:7.0pt;font-family:"Times New Roman",serif
<p class=MsoListParagraph style='text-indent:-18.0pt'><span style='font-family:
Symbol'>'</span><span style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Bearings can be calculated using the envelope of the waveform rather than
the full waveform. The waveform or envelope can also be filtered prior to
</span>Bearings can be calculated using the envelope of the waveform rather
than the full waveform. The waveform or envelope can also be filtered prior to
bearing calculation.</p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span style='font-family:
@ -3713,8 +3793,8 @@ the correct data stream. This has been fixed. </p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span style='font-family:
Symbol'>'</span><span style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Whistle classifier has some new features in the classifier training
panel. It is also now possible to export training data files directly from binary
data files. </p>
panel. It is also now possible to export training data files directly from
binary data files. </p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span style='font-family:
Symbol'>'</span><span style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
@ -3841,14 +3921,14 @@ modules which resulted in a number of bugs which could cause confusion as to
which hydrophones were being used during localisation or during calibrated
measurement. The situation tended to only arise with a small number of ASIO
sound cards such as the RME Fireface 400 on which the most useful inputs, the
balanced line inputs, are hardware channels 4,5,6 and 7 on the back of the
instrument. (On the Fireface 800, the balanced line inputs are channels 0 to
7). When using the National Instruments system, data were always sent into the
rest of PAMGUARD with sequential channel numbering starting at 0. This was
required in order to support multiple NI Daq boards where it is possible to
read for example channel 0 and 1 on two different devices, so to uniquely
identify channels in the rest of PAMGUARD, the only rational thing to do was to
re-label those channels 0,1,2,3. </p>
balanced line inputs, are hardware channels 4,5,6 and 7 on the back of the instrument.
(On the Fireface 800, the balanced line inputs are channels 0 to 7). When using
the National Instruments system, data were always sent into the rest of
PAMGUARD with sequential channel numbering starting at 0. This was required in
order to support multiple NI Daq boards where it is possible to read for
example channel 0 and 1 on two different devices, so to uniquely identify
channels in the rest of PAMGUARD, the only rational thing to do was to re-label
those channels 0,1,2,3. </p>
<p class=MsoNormal>There have been other annoyances with the ASIO channel
numbering scheme. For instance, if you had a configuration which worked in real
@ -3965,12 +4045,12 @@ port is closed. Might prevent a few problems when using a GPS. </p>
<p class=MsoNormal><b>Bug Fixes</b></p>
<p class=MsoNormal>Crashes caused in real time or Mixed Mode if the number of
software channels exceeds the number of hydrophones configured in the array manager.
It is of course illogical to have software channels which are not assigned to a
hydrophone, so rather than entirely prevent PAMGUARD from crashing I have
inserted additional checks into the hydrophone array dialog which will prevent
the user from closing that dialog unless all software channels are assigned to
a hydrophone. </p>
software channels exceeds the number of hydrophones configured in the array
manager. It is of course illogical to have software channels which are not
assigned to a hydrophone, so rather than entirely prevent PAMGUARD from
crashing I have inserted additional checks into the hydrophone array dialog
which will prevent the user from closing that dialog unless all software
channels are assigned to a hydrophone. </p>
<h2><span style='font-weight:normal'>Version 1.8.01 Beta February 2010</span></h2>
@ -4020,9 +4100,9 @@ Symbol'>'</span><span style='font-size:7.0pt;font-family:"Times New Roman",serif
<p class=MsoListParagraph style='text-indent:-18.0pt'><span style='font-family:
Symbol'>'</span><span style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>False buffer overflows at low sample rates stopped (size of data in individual
data blocks had been increased at low sample rates, but when this exceeded 3s a
false buffer overflow would occur).</p>
</span>False buffer overflows at low sample rates stopped (size of data in
individual data blocks had been increased at low sample rates, but when this
exceeded 3s a false buffer overflow would occur).</p>
<p class=MsoNormal>&nbsp;</p>
@ -4036,8 +4116,8 @@ Symbol'>'</span><span style='font-size:7.0pt;font-family:"Times New Roman",serif
<p class=MsoListParagraph style='text-indent:-18.0pt'><span style='font-family:
Symbol'>'</span><span style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>This results in a major speed up of data exchange between modules and
can lead to a x4 improvement in overall performance. </p>
</span>This results in a major speed up of data exchange between modules and can
lead to a x4 improvement in overall performance. </p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span style='font-family:
Symbol'>'</span><span style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
@ -4072,8 +4152,8 @@ arrays to give two polar angle coordinates. this can be used to resolve left
right ambiguity and is implemented for both the click and the whistle/moan
detectors. As a result, the click detector bearing time display can now be set
to go from -180 to 180 degrees rather than 0 - 180 degrees. In this case,
clicks in the upper half of the bearing display will be to port and clicks in the
right half will be to starboard. As you pass a whale which is to port, the
clicks in the upper half of the bearing display will be to port and clicks in
the right half will be to starboard. As you pass a whale which is to port, the
clicks will move UP the display. In the long term, I hope to turn this display
around so that time is up the screen rather than across.&nbsp; </p>
@ -4150,9 +4230,9 @@ Symbol'>'</span><span style='font-size:7.0pt;font-family:"Times New Roman",serif
<p class=MsoListParagraph style='text-indent:-18.0pt'><span style='font-family:
Symbol'>'</span><span style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Channel lists in output data streams of Decimator and other modules
fixed, so that when channel numbers change, downstream modules configurations
get the correct list of available channels. </p>
</span>Channel lists in output data streams of Decimator and other modules fixed,
so that when channel numbers change, downstream modules configurations get the
correct list of available channels. </p>
<p class=MsoListParagraph style='text-indent:-18.0pt'><span style='font-family:
Symbol'>'</span><span style='font-size:7.0pt;font-family:"Times New Roman",serif'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
@ -4364,8 +4444,8 @@ acquisition.&nbsp; </p>
<p class=MsoNormal><b>Bug fixes</b></p>
<p class=MsoNormal>Speed up of graphics, particularly regarding large quantities
of gps track &nbsp;data</p>
<p class=MsoNormal>Speed up of graphics, particularly regarding large
quantities of gps track &nbsp;data</p>
<p class=MsoNormal>National Instruments cards with names &gt; 20 characters
long are now correctly &nbsp;recognised. </p>
@ -4775,8 +4855,8 @@ Symbol'>'</span><span style='font-size:7.0pt;font-family:"Times New Roman",serif
<p class=MsoNormal>&nbsp;</p>
<p class=MsoNormal><a name="_Toc312065304"></a><a name="_Toc312063949"></a><span
class=Heading2Char><span style='font-size:13.0pt'>1.0Beta 22 Jan 2008 -
Pamguard starts two releases, core and beta release</span></span>, </p>
class=Heading2Char><span style='font-size:13.0pt'>1.0Beta 22 Jan 2008 - Pamguard
starts two releases, core and beta release</span></span>, </p>
<p class=MsoNormal>this is the beta release</p>
@ -4848,12 +4928,12 @@ and Ishmael-type detectors and localisers. </p>
<p class=MsoNormal>Information from above modules can be displayed on
configurable user displays which support real time scrolling spectrograms and
radar displays. Detection and localisation information can be optionally
displayed on the map display.Map enhancements include improved scrolling whereby
the user can click and drag to pan the area. PamGuard can now interface with
MySQL database servers and users can easily select which information is logged.
(This replaces the previous 'flat-file' logging feature). A simulation module
allows virtual vocalising animals to be placed on the map to assist in training
and development. Extensive online user help has been added to PamGuard
displayed on the map display.Map enhancements include improved scrolling
whereby the user can click and drag to pan the area. PamGuard can now interface
with MySQL database servers and users can easily select which information is
logged. (This replaces the previous 'flat-file' logging feature). A simulation
module allows virtual vocalising animals to be placed on the map to assist in
training and development. Extensive online user help has been added to PamGuard
Application</p>
<h2>0.03b - first version used in a real 'at sea' environment.18/08/06</h2>

View File

@ -1,6 +1,12 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
<<<<<<<< HEAD:repo/org/pamguard/x3/2.2.5/_remote.repositories
#Wed Aug 02 09:25:44 BST 2023
X3-2.2.5-sources.jar>=
X3-2.2.5-javadoc.jar>=
X3-2.2.5.jar>=
X3-2.2.5.pom>=
========
#Thu Dec 21 11:14:13 GMT 2023
nilus-3.0.pom>=
nilus-3.0.jar>=
>>>>>>>> upstream/main:repo/tethys/org/nilus/3.0/_remote.repositories

View File

@ -1,4 +1,10 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
<<<<<<<< HEAD:repo/pamguard/org/x3/2.2.3/_remote.repositories
#Thu Oct 26 14:35:14 BST 2023
x3-2.2.3.jar>=
x3-2.2.3.pom>=
========
#Fri Jan 12 10:06:13 GMT 2024
x3-2.2.7.jar>=
x3-2.2.7.pom>=
>>>>>>>> upstream/main:repo/pamguard/org/x3/2.2.7/_remote.repositories

View File

@ -1,12 +1,25 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
<<<<<<<< HEAD:repo/pamguard/org/x3/2.2.3/x3-2.2.3-javadoc.jar.lastUpdated
#Thu Oct 26 14:39:06 BST 2023
@default-talan-https\://nexus.talanlabs.com/content/repositories/releases/.lastUpdated=1698327545863
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.lastUpdated=1698327544361
========
#Fri Jan 12 10:09:16 GMT 2024
@default-talan-https\://nexus.talanlabs.com/content/repositories/releases/.lastUpdated=1705054156080
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.lastUpdated=1705054154613
>>>>>>>> upstream/main:repo/pamguard/org/x3/2.2.7/x3-2.2.7-javadoc.jar.lastUpdated
https\://repo1.maven.org/maven2/.error=
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.error=
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.error=
https\://nexus.bedatadriven.com/content/groups/public/.error=
<<<<<<<< HEAD:repo/pamguard/org/x3/2.2.3/x3-2.2.3-javadoc.jar.lastUpdated
https\://nexus.bedatadriven.com/content/groups/public/.lastUpdated=1698327545797
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.lastUpdated=1698327545616
https\://repo1.maven.org/maven2/.lastUpdated=1698327546068
https\://nexus.talanlabs.com/content/repositories/releases/.error=Could not transfer artifact pamguard.org\:x3\:jar\:javadoc\:2.2.3 from/to talan (https\://nexus.talanlabs.com/content/repositories/releases/)\: nexus.talanlabs.com
========
https\://nexus.bedatadriven.com/content/groups/public/.lastUpdated=1705054156060
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.lastUpdated=1705054155868
https\://repo1.maven.org/maven2/.lastUpdated=1705054156344
https\://nexus.talanlabs.com/content/repositories/releases/.error=Could not transfer artifact pamguard.org\:x3\:jar\:javadoc\:2.2.7 from/to talan (https\://nexus.talanlabs.com/content/repositories/releases/)\: nexus.talanlabs.com
>>>>>>>> upstream/main:repo/pamguard/org/x3/2.2.7/x3-2.2.7-javadoc.jar.lastUpdated

View File

@ -1,4 +1,5 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
<<<<<<<< HEAD:repo/pamguard/org/x3/2.2.3/x3-2.2.3-sources.jar.lastUpdated
#Thu Oct 26 15:50:39 BST 2023
@default-talan-https\://nexus.talanlabs.com/content/repositories/releases/.lastUpdated=1698327461349
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.lastUpdated=1698327459306
@ -12,3 +13,16 @@ https\://nexus.talanlabs.com/content/repositories/releases/.error=Could not tran
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG/repo/.lastUpdated=1698331839687
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.error=
https\://nexus.bedatadriven.com/content/groups/public/.lastUpdated=1698327461288
========
#Fri Jan 12 10:06:49 GMT 2024
@default-talan-https\://nexus.talanlabs.com/content/repositories/releases/.lastUpdated=1705054009062
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.lastUpdated=1705054007956
https\://repo1.maven.org/maven2/.error=
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.error=
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.error=
https\://nexus.bedatadriven.com/content/groups/public/.error=
https\://nexus.bedatadriven.com/content/groups/public/.lastUpdated=1705054008945
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.lastUpdated=1705054008751
https\://repo1.maven.org/maven2/.lastUpdated=1705054009308
https\://nexus.talanlabs.com/content/repositories/releases/.error=Could not transfer artifact pamguard.org\:x3\:jar\:sources\:2.2.7 from/to talan (https\://nexus.talanlabs.com/content/repositories/releases/)\: nexus.talanlabs.com
>>>>>>>> upstream/main:repo/pamguard/org/x3/2.2.7/x3-2.2.7-sources.jar.lastUpdated

View File

@ -4,6 +4,10 @@
<modelVersion>4.0.0</modelVersion>
<groupId>pamguard.org</groupId>
<artifactId>x3</artifactId>
<<<<<<<< HEAD:repo/pamguard/org/x3/2.2.3/x3-2.2.3.pom
<version>2.2.3</version>
========
<version>2.2.7</version>
>>>>>>>> upstream/main:repo/pamguard/org/x3/2.2.7/x3-2.2.7.pom
<description>POM was created from install:install-file</description>
</project>

View File

@ -0,0 +1,10 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
<<<<<<<< HEAD:repo/pamguard/org/x3/2.2.3/_remote.repositories
#Thu Oct 26 14:35:14 BST 2023
x3-2.2.3.jar>=
x3-2.2.3.pom>=
========
#Fri Jan 12 10:06:13 GMT 2024
x3-2.2.7.jar>=
x3-2.2.7.pom>=
>>>>>>>> upstream/main:repo/pamguard/org/x3/2.2.7/_remote.repositories

View File

@ -0,0 +1,11 @@
#Fri Jan 12 10:09:16 GMT 2024
bedatadriven|https\://nexus.bedatadriven.com/content/groups/public/|javadoc=1705054156349
repo|file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo|sources=1705054009341
repo|file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo|javadoc=1705054156349
talan|https\://nexus.talanlabs.com/content/repositories/releases/|javadoc=1705054156349
central|https\://repo1.maven.org/maven2|sources=1705054009341
unidata-all|https\://artifacts.unidata.ucar.edu/repository/unidata-all/|javadoc=1705054156349
talan|https\://nexus.talanlabs.com/content/repositories/releases/|sources=1705054009341
bedatadriven|https\://nexus.bedatadriven.com/content/groups/public/|sources=1705054009341
unidata-all|https\://artifacts.unidata.ucar.edu/repository/unidata-all/|sources=1705054009341
central|https\://repo1.maven.org/maven2|javadoc=1705054156349

View File

@ -0,0 +1,25 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
<<<<<<<< HEAD:repo/pamguard/org/x3/2.2.3/x3-2.2.3-javadoc.jar.lastUpdated
#Thu Oct 26 14:39:06 BST 2023
@default-talan-https\://nexus.talanlabs.com/content/repositories/releases/.lastUpdated=1698327545863
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.lastUpdated=1698327544361
========
#Fri Jan 12 10:09:16 GMT 2024
@default-talan-https\://nexus.talanlabs.com/content/repositories/releases/.lastUpdated=1705054156080
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.lastUpdated=1705054154613
>>>>>>>> upstream/main:repo/pamguard/org/x3/2.2.7/x3-2.2.7-javadoc.jar.lastUpdated
https\://repo1.maven.org/maven2/.error=
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.error=
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.error=
https\://nexus.bedatadriven.com/content/groups/public/.error=
<<<<<<<< HEAD:repo/pamguard/org/x3/2.2.3/x3-2.2.3-javadoc.jar.lastUpdated
https\://nexus.bedatadriven.com/content/groups/public/.lastUpdated=1698327545797
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.lastUpdated=1698327545616
https\://repo1.maven.org/maven2/.lastUpdated=1698327546068
https\://nexus.talanlabs.com/content/repositories/releases/.error=Could not transfer artifact pamguard.org\:x3\:jar\:javadoc\:2.2.3 from/to talan (https\://nexus.talanlabs.com/content/repositories/releases/)\: nexus.talanlabs.com
========
https\://nexus.bedatadriven.com/content/groups/public/.lastUpdated=1705054156060
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.lastUpdated=1705054155868
https\://repo1.maven.org/maven2/.lastUpdated=1705054156344
https\://nexus.talanlabs.com/content/repositories/releases/.error=Could not transfer artifact pamguard.org\:x3\:jar\:javadoc\:2.2.7 from/to talan (https\://nexus.talanlabs.com/content/repositories/releases/)\: nexus.talanlabs.com
>>>>>>>> upstream/main:repo/pamguard/org/x3/2.2.7/x3-2.2.7-javadoc.jar.lastUpdated

View File

@ -0,0 +1,28 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
<<<<<<<< HEAD:repo/pamguard/org/x3/2.2.3/x3-2.2.3-sources.jar.lastUpdated
#Thu Oct 26 15:50:39 BST 2023
@default-talan-https\://nexus.talanlabs.com/content/repositories/releases/.lastUpdated=1698327461349
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.lastUpdated=1698327459306
https\://repo1.maven.org/maven2/.error=
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG/repo/.error=
https\://nexus.bedatadriven.com/content/groups/public/.error=
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.error=
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.lastUpdated=1698327460817
https\://repo1.maven.org/maven2/.lastUpdated=1698327461652
https\://nexus.talanlabs.com/content/repositories/releases/.error=Could not transfer artifact pamguard.org\:x3\:jar\:sources\:2.2.3 from/to talan (https\://nexus.talanlabs.com/content/repositories/releases/)\: nexus.talanlabs.com
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG/repo/.lastUpdated=1698331839687
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.error=
https\://nexus.bedatadriven.com/content/groups/public/.lastUpdated=1698327461288
========
#Fri Jan 12 10:06:49 GMT 2024
@default-talan-https\://nexus.talanlabs.com/content/repositories/releases/.lastUpdated=1705054009062
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.lastUpdated=1705054007956
https\://repo1.maven.org/maven2/.error=
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardPAMGuard/repo/.error=
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.error=
https\://nexus.bedatadriven.com/content/groups/public/.error=
https\://nexus.bedatadriven.com/content/groups/public/.lastUpdated=1705054008945
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.lastUpdated=1705054008751
https\://repo1.maven.org/maven2/.lastUpdated=1705054009308
https\://nexus.talanlabs.com/content/repositories/releases/.error=Could not transfer artifact pamguard.org\:x3\:jar\:sources\:2.2.7 from/to talan (https\://nexus.talanlabs.com/content/repositories/releases/)\: nexus.talanlabs.com
>>>>>>>> upstream/main:repo/pamguard/org/x3/2.2.7/x3-2.2.7-sources.jar.lastUpdated

Binary file not shown.

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>pamguard.org</groupId>
<artifactId>x3</artifactId>
<<<<<<<< HEAD:repo/pamguard/org/x3/2.2.3/x3-2.2.3.pom
<version>2.2.3</version>
========
<version>2.2.7</version>
>>>>>>>> upstream/main:repo/pamguard/org/x3/2.2.7/x3-2.2.7.pom
<description>POM was created from install:install-file</description>
</project>

View File

@ -0,0 +1,4 @@
#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
#Thu Dec 21 11:13:37 GMT 2023
javaclient-3.0.jar>=
javaclient-3.0.pom>=

Binary file not shown.

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>tethys.org</groupId>
<artifactId>javaclient</artifactId>
<version>3.0</version>
<description>POM was created from install:install-file</description>
</project>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>tethys.org</groupId>
<artifactId>javaclient</artifactId>
<versioning>
<release>3.0</release>
<versions>
<version>3.0</version>
</versions>
<lastUpdated>20231221111337</lastUpdated>
</versioning>
</metadata>

View File

@ -0,0 +1,12 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
<<<<<<<< HEAD:repo/org/pamguard/x3/2.2.5/_remote.repositories
#Wed Aug 02 09:25:44 BST 2023
X3-2.2.5-sources.jar>=
X3-2.2.5-javadoc.jar>=
X3-2.2.5.jar>=
X3-2.2.5.pom>=
========
#Thu Dec 21 11:14:13 GMT 2023
nilus-3.0.pom>=
nilus-3.0.jar>=
>>>>>>>> upstream/main:repo/tethys/org/nilus/3.0/_remote.repositories

View File

@ -0,0 +1,11 @@
#Thu Dec 21 16:45:12 GMT 2023
bedatadriven|https\://nexus.bedatadriven.com/content/groups/public/|javadoc=1703177112968
talan|https\://nexus.talanlabs.com/content/repositories/releases/|javadoc=1703177112968
repo|file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG_2/repo|javadoc=1703177112968
central|https\://repo1.maven.org/maven2|sources=1703157324238
unidata-all|https\://artifacts.unidata.ucar.edu/repository/unidata-all/|javadoc=1703177112968
repo|file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG_2/repo|sources=1703157324238
talan|https\://nexus.talanlabs.com/content/repositories/releases/|sources=1703157324238
bedatadriven|https\://nexus.bedatadriven.com/content/groups/public/|sources=1703157324238
unidata-all|https\://artifacts.unidata.ucar.edu/repository/unidata-all/|sources=1703157324238
central|https\://repo1.maven.org/maven2|javadoc=1703177112968

View File

@ -0,0 +1,12 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Thu Dec 21 16:45:12 GMT 2023
@default-talan-https\://nexus.talanlabs.com/content/repositories/releases/.lastUpdated=1703177112601
https\://repo1.maven.org/maven2/.error=
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG_2/repo/.error=
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG_2/repo/.lastUpdated=1703177110940
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.error=
https\://nexus.bedatadriven.com/content/groups/public/.error=
https\://nexus.bedatadriven.com/content/groups/public/.lastUpdated=1703177112519
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.lastUpdated=1703177112101
https\://repo1.maven.org/maven2/.lastUpdated=1703177112965
https\://nexus.talanlabs.com/content/repositories/releases/.error=Could not transfer artifact tethys.org\:nilus\:jar\:javadoc\:3.0 from/to talan (https\://nexus.talanlabs.com/content/repositories/releases/)\: nexus.talanlabs.com

View File

@ -0,0 +1,12 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Thu Dec 21 11:15:24 GMT 2023
@default-talan-https\://nexus.talanlabs.com/content/repositories/releases/.lastUpdated=1703157323819
https\://repo1.maven.org/maven2/.error=
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG_2/repo/.error=
file\://C\:\\Users\\dg50\\source\\repos\\PAMGuardDG_2/repo/.lastUpdated=1703157322932
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.error=
https\://nexus.bedatadriven.com/content/groups/public/.error=
https\://nexus.bedatadriven.com/content/groups/public/.lastUpdated=1703157323770
https\://artifacts.unidata.ucar.edu/repository/unidata-all/.lastUpdated=1703157323508
https\://repo1.maven.org/maven2/.lastUpdated=1703157324237
https\://nexus.talanlabs.com/content/repositories/releases/.error=Could not transfer artifact tethys.org\:nilus\:jar\:sources\:3.0 from/to talan (https\://nexus.talanlabs.com/content/repositories/releases/)\: nexus.talanlabs.com

Binary file not shown.

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>tethys.org</groupId>
<artifactId>nilus</artifactId>
<version>3.0</version>
<description>POM was created from install:install-file</description>
</project>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>tethys.org</groupId>
<artifactId>nilus</artifactId>
<versioning>
<release>3.0</release>
<versions>
<version>3.0</version>
</versions>
<lastUpdated>20231221111413</lastUpdated>
</versioning>
</metadata>

View File

@ -5,6 +5,7 @@ import java.lang.reflect.Field;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
public class AISParameters implements Serializable, Cloneable, ManagedParameters {
@ -51,7 +52,7 @@ public class AISParameters implements Serializable, Cloneable, ManagedParameters
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
try {
Field field = this.getClass().getDeclaredField("nmeaSource");
ps.put(new PrivatePamParameterData(this, field) {

View File

@ -5,6 +5,7 @@ import java.io.Serializable;
import NMEA.NMEABitArray;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamUtils.LatLong;
/**
@ -160,7 +161,7 @@ sensor.
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DISPLAY);
return ps;
}

View File

@ -6,6 +6,7 @@ import java.util.Calendar;
import NMEA.NMEABitArray;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamUtils.PamCalendar;
public class AISStaticData extends AISReport implements Serializable, ManagedParameters{
@ -393,7 +394,7 @@ public class AISStaticData extends AISReport implements Serializable, ManagedPar
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DISPLAY);
return ps;
}

View File

@ -283,6 +283,16 @@ public class AcquisitionControl extends RawInputControlledUnit implements PamSet
return daqControllers;
}
@Override
public String getDataLocation() {
if (offlineFileServer == null) {
return null;
}
else {
return offlineFileServer.getDataLocation();
}
}
public AcquisitionProcess getDaqProcess() {
return acquisitionProcess;
}

View File

@ -151,6 +151,7 @@ public class AcquisitionDialog extends PamDialog {
acquisitionParameters = oldParams.clone();
acquisitionControl = daqControl;
// singleInstance = null;
if (singleInstance == null || singleInstance.getOwner() != parentFrame) {
singleInstance = new AcquisitionDialog(parentFrame);

View File

@ -10,6 +10,7 @@ import Array.Preamplifier;
import PamController.PamController;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
import PamguardMVC.PamConstants;
@ -320,7 +321,7 @@ public class AcquisitionParameters implements Serializable, Cloneable, ManagedPa
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
try {
Field field = this.getClass().getDeclaredField("channelList");
ps.put(new PrivatePamParameterData(this, field) {

View File

@ -211,10 +211,10 @@ public class AcquisitionProcess extends PamProcess implements DataInputStore {
if (systemPrepared == false) return;
newDataQueue.clearList(); // clear this first to make sure nothing new comes in.
// before starting, clear all old data
rawDataBlock.clearAll();
newDataQueue.clearList();
sampleRateErrorFilter.prepareFilter();
totalExtraSamples = 0;
@ -302,6 +302,7 @@ public class AcquisitionProcess extends PamProcess implements DataInputStore {
// called by PamController.
// stop the running system - not the selected system since
// this may have changed
restartTimer.stop();
// stallCheckTimer.stop();
pamStop("");
@ -471,6 +472,9 @@ public class AcquisitionProcess extends PamProcess implements DataInputStore {
* have been emptied and processing has stopped
*/
protected void pamHasStopped() {
newDataQueue.clearList(); // clear this first to make sure nothing new comes in.
if (runningSystem == null){
runningSystem = acquisitionControl.findDaqSystem(null);
}
@ -650,9 +654,10 @@ public class AcquisitionProcess extends PamProcess implements DataInputStore {
restartTimer.stop();
PamController.getInstance().pamStop();
PamController.getInstance().pamStart(false);
PamController.getInstance().restartPamguard();
// PamController.getInstance().pamStop();
//
// PamController.getInstance().pamStart(false);
}

View File

@ -5,6 +5,7 @@ import java.lang.reflect.Field;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
import binaryFileStorage.BinaryHeader;
import binaryFileStorage.BinaryObjectData;
@ -30,7 +31,7 @@ class DaqStatusModuleHeader extends ModuleHeader implements Serializable, Manage
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
try {
Field field = this.getClass().getDeclaredField("daqName");
ps.put(new PrivatePamParameterData(this, field) {

View File

@ -5,6 +5,7 @@ import java.util.ArrayList;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
/**
* Used by FileInputSystem
@ -78,7 +79,7 @@ public class FileInputParameters implements Serializable, Cloneable, ManagedPara
return null;
}
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}
}

View File

@ -318,13 +318,12 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
}
selection = folderInputParameters.getSelectedFiles();
}
if (selection!=null && selection.length > 0) {
if (selection == null) {
return 0;
}
if (selection.length > 0) {
System.out.println("FolderInputSystem.makeSelFileList(): Searching for sound files in " + selection[0]);
}
if (selection==null) return 0; //sometimes happens
return makeSelFileList(selection);
}
@ -519,8 +518,8 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
*/
public void newFileList(FileListData<WavFileType> fileListData) {
System.out.printf("Wav list recieved with %d files after %d millis\n",
fileListData.getFileCount(), System.currentTimeMillis() - wavListStart);
// System.out.printf("Wav list recieved with %d files after %d millis\n",
// fileListData.getFileCount(), System.currentTimeMillis() - wavListStart);
allFiles = fileListData.getListCopy();
List<WavFileType> asList = allFiles;
@ -539,8 +538,6 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
if (file.isFile() && !file.isHidden() && acquisitionDialog != null) {
//Hidden files should not be used in analysis...
try {
System.out.println("FolderInputSystem - newFileList");
audioStream = PamAudioFileManager.getInstance().getAudioInputStream(file);
AudioFormat audioFormat = audioStream.getFormat();
fileSamples = audioStream.getFrameLength();
@ -703,7 +700,7 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
if (currentFile > 0 && currentFile >= allFiles.size()) {
fileListComplete();
}
// System.out.println("FolderinputSytem: daqHasEnded");
System.out.println("FolderinputSytem: daqHasEnded");
}
private void setFolderProgress() {
@ -923,7 +920,6 @@ public class FolderInputSystem extends FileInputSystem implements PamSettings, D
return true;
}
for (int i = 0; i < allFiles.size(); i++) {
System.out.println("Get file start time");
long fileStart = getFileStartTime(allFiles.get(i).getAbsoluteFile());
if (fileStart >= startTime) {
currentFile = i;

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import simulatedAcquisition.SimProcess;
/**
@ -47,7 +48,7 @@ public class SoundCardParameters implements Serializable, Cloneable, ManagedPara
return null;
}
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}
}

View File

@ -6,6 +6,7 @@ import java.util.TimeZone;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import soundtrap.STXMLFile;
public class StandardFileDateSettings implements Serializable, Cloneable, ManagedParameters {
@ -150,7 +151,7 @@ public class StandardFileDateSettings implements Serializable, Cloneable, Manage
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DISPLAY);
return ps;
}
}

View File

@ -6,6 +6,7 @@ import Acquisition.AcquisitionControl;
import Acquisition.AcquisitionDialog;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
public class PPSParameters implements Cloneable, Serializable, ManagedParameters {
@ -36,7 +37,7 @@ public class PPSParameters implements Cloneable, Serializable, ManagedParameters
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -14,6 +14,7 @@ import javax.sound.sampled.UnsupportedAudioFileException;
import org.codehaus.plexus.util.FileUtils;
import Acquisition.offlineFuncs.AquisitionLoadPoint;
import PamDetection.RawDataUnit;
import PamguardMVC.PamConstants;
//import PamUtils.CPUMonitor;
import PamguardMVC.PamDataBlock;
import PamguardMVC.dataOffline.OfflineDataLoadInfo;
@ -47,6 +48,8 @@ public class WavAudioFile implements PamAudioFileLoader {
* Get the file extensions associated with loading these data.
*/
protected ArrayList<String> fileExtensions;
private double[] channelBackground = new double[PamConstants.MAX_CHANNELS];
public WavAudioFile() {
fileExtensions = new ArrayList<String>(Arrays.asList(new String[]{".wav", ".aif", ".aiff"}));
@ -190,6 +193,9 @@ public class WavAudioFile implements PamAudioFileLoader {
newDataUnit = new RawDataUnit(ms, 1 << ichan, totalSamples, newSamples);
newDataUnit.setFileSamples(totalSamples + skipped / frameSize); //set the number samples into the wav file.
removeDCComponent(doubleData[ichan], ichan, audioFormat);
newDataUnit.setRawData(doubleData[ichan], true);
//System.out.println("New wav data: " + PamCalendar.formatDateTime(newDataUnit.getTimeMilliseconds()));
@ -211,6 +217,26 @@ public class WavAudioFile implements PamAudioFileLoader {
}
private void removeDCComponent(double[] ds, int channel, AudioFormat audioFormat) {
/*
* do a simple background subtraction with about a 1s time constant.
* If the background is currently zero initialise it to the mean data value.
*/
double alpha = 1./audioFormat.getSampleRate();
double alpha_1 = 1.-alpha;
double bg = channelBackground[channel];
if (bg == 0.) {
for (int i = 0; i < ds.length; i++) {
bg += ds[i];
}
bg /= ds.length;
}
for (int i = 0; i < ds.length; i++) {
ds[i] -= bg;
bg = bg*alpha_1 + ds[i]*alpha;
}
}
/**
* Open a sound file.
* @param soundFile

View File

@ -6,6 +6,7 @@ import java.lang.reflect.Field;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
import PamUtils.LatLong;
@ -95,7 +96,7 @@ public class AirgunParameters implements Serializable, Cloneable, ManagedParamet
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DISPLAY);
try {
Field field = this.getClass().getDeclaredField("dimE");
ps.put(new PrivatePamParameterData(this, field) {

View File

@ -44,6 +44,8 @@ public class ArrayDialog extends PamDialog implements ActionListener {
private EnvironmentPanel environmentPanel;
private HydrophoneDiagram hydrophoneDiagram;
private InstrumentIdentityPanel instrumentIdentityPanel;
private JButton okButton, cancelButton;
@ -69,11 +71,14 @@ public class ArrayDialog extends PamDialog implements ActionListener {
eastPanel.add(channelPanel.getChannelPanel());
environmentPanel = new EnvironmentPanel(this);
instrumentIdentityPanel = new InstrumentIdentityPanel();
// eastPanel.add(environmentPanel.getEnvironmentPanel());
hydrophoneDiagram = new HydrophoneDiagram(this);
JPanel westPanel = new JPanel(new BorderLayout());
westPanel.add(BorderLayout.CENTER, hydrophoneDiagram.getPlotPanel());
westPanel.add(BorderLayout.SOUTH, environmentPanel.getEnvironmentPanel());
westPanel.add(BorderLayout.NORTH, instrumentIdentityPanel.getComponent());
splitPanel.add(westPanel);
@ -144,6 +149,7 @@ public class ArrayDialog extends PamDialog implements ActionListener {
hydrophoneDialogPanel.setParams(selArray);
channelPanel.setParams();
hydrophoneDiagram.rePaint();
instrumentIdentityPanel.setParams(selArray);
if (selArray != null) {
environmentPanel.setNewSpeed(selArray.getSpeedOfSound());
}
@ -171,6 +177,7 @@ public class ArrayDialog extends PamDialog implements ActionListener {
array.setSpeedOfSound(environmentPanel.getNewSpeed());
array.setSpeedOfSoundError(environmentPanel.getNewError());
hydrophoneDialogPanel.getParams();
instrumentIdentityPanel.getParams(array);
if (checkDaqChannels(array) == false) {
return false;
@ -250,6 +257,7 @@ public class ArrayDialog extends PamDialog implements ActionListener {
environmentPanel.setNewSpeed(currentArray.getSpeedOfSound());
environmentPanel.setNewError(currentArray.getSpeedOfSoundError());
}
instrumentIdentityPanel.setParams(currentArray);
}
void newChannelSelection() {

View File

@ -28,6 +28,7 @@ import java.util.Arrays;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
import pamMaths.PamVector;
import PamView.PamSymbol;
@ -333,7 +334,7 @@ public class Hydrophone implements Serializable, Cloneable, ManagedParameters {
/**
* @return Returns the coordinate.
*/
protected double[] getCoordinates() {
public double[] getCoordinates() {
return Arrays.copyOf(coordinate,3);
}
@ -478,7 +479,7 @@ public class Hydrophone implements Serializable, Cloneable, ManagedParameters {
@Override
public PamParameterSet getParameterSet() {
PamParameterSet pps = PamParameterSet.autoGenerate(this);
PamParameterSet pps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
Field f;
try {
f = this.getClass().getDeclaredField("coordinate");

View File

@ -54,7 +54,7 @@ public class HydrophoneDataBlock extends PamDataBlock<HydrophoneDataUnit> {
*/
@Override
public int getNumRequiredBeforeLoadTime() {
return ArrayManager.getArrayManager().getCurrentArray().getHydrophoneCount();
return ArrayManager.getArrayManager().getCurrentArray().getHydrophoneCount()*2;
}

View File

@ -7,6 +7,7 @@ import Array.streamerOrigin.StreamerDataIterator;
import GPS.GpsData;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
import PamUtils.LatLong;
import PamguardMVC.PamDataBlock;
@ -225,7 +226,7 @@ abstract public class HydrophoneLocator implements Serializable, Cloneable, Mana
*/
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
try {
Field field = this.getClass().getDeclaredField("pamArray");
ps.put(new PrivatePamParameterData(this, field) {

View File

@ -3,152 +3,151 @@ package Array;
import pamScrollSystem.AbstractScrollManager;
import PamUtils.PamCalendar;
import PamView.symbol.StandardSymbolManager;
import PamguardMVC.PamConstants;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamProcess;
public class HydrophoneProcess extends PamProcess{
private StreamerDataBlock streamerDataBlock;
private boolean arrayDataSaved;
private ArrayManager arrayManager;
private HydrophoneDataBlock hydrophoneDataBlock;
private HydrophoneSQLLogging hydrophoneSQLlogging;
public HydrophoneProcess(ArrayManager arrayManager) {
super(arrayManager, null);
this.arrayManager = arrayManager;
addOutputDataBlock(streamerDataBlock = new StreamerDataBlock(this));
streamerDataBlock.setOverlayDraw(new StreamerOverlayGraphics());
streamerDataBlock.setPamSymbolManager(new StandardSymbolManager(streamerDataBlock, StreamerOverlayGraphics.streamerSymbol, true));
streamerDataBlock.SetLogging(new StreamerLogging(this, streamerDataBlock));
private StreamerDataBlock streamerDataBlock;
private boolean arrayDataSaved;
private ArrayManager arrayManager;
private HydrophoneDataBlock hydrophoneDataBlock;
private HydrophoneSQLLogging hydrophoneSQLlogging;
public HydrophoneProcess(ArrayManager arrayManager) {
super(arrayManager, null);
this.arrayManager = arrayManager;
addOutputDataBlock(streamerDataBlock = new StreamerDataBlock(this));
streamerDataBlock.setOverlayDraw(new StreamerOverlayGraphics());
streamerDataBlock.setPamSymbolManager(new StandardSymbolManager(streamerDataBlock, StreamerOverlayGraphics.streamerSymbol, true));
streamerDataBlock.SetLogging(new StreamerLogging(this, streamerDataBlock));
hydrophoneDataBlock= new HydrophoneDataBlock("Hydrophone Data", this, 0xFFFFFFFF);
hydrophoneSQLlogging=new HydrophoneSQLLogging(hydrophoneDataBlock);
hydrophoneDataBlock.SetLogging(hydrophoneSQLlogging);
addOutputDataBlock(hydrophoneDataBlock);
streamerDataBlock.setMixedDirection(PamDataBlock.MIX_OUTOFDATABASE);
hydrophoneDataBlock.setMixedDirection(PamDataBlock.MIX_OUTOFDATABASE);
}
@Override
public void destroyProcess(){
for (int i=0; i<super.outputDataBlocks.size(); i++){
AbstractScrollManager.getScrollManager().removeFromSpecialDatablock(outputDataBlocks.get(i));
hydrophoneDataBlock= new HydrophoneDataBlock("Hydrophone Data", this, 0xFFFFFFFF);
hydrophoneSQLlogging=new HydrophoneSQLLogging(hydrophoneDataBlock);
hydrophoneDataBlock.SetLogging(hydrophoneSQLlogging);
addOutputDataBlock(hydrophoneDataBlock);
streamerDataBlock.setMixedDirection(PamDataBlock.MIX_OUTOFDATABASE);
hydrophoneDataBlock.setMixedDirection(PamDataBlock.MIX_OUTOFDATABASE);
}
super.destroyProcess();
}
@Override
public void destroyProcess(){
for (int i=0; i<super.outputDataBlocks.size(); i++){
AbstractScrollManager.getScrollManager().removeFromSpecialDatablock(outputDataBlocks.get(i));
}
super.destroyProcess();
}
@Override
public void addOutputDataBlock(PamDataBlock outputDataBlock){
AbstractScrollManager.getScrollManager().addToSpecialDatablock(outputDataBlock, 60000, 0);
super.addOutputDataBlock(outputDataBlock);
}
@Override
public void pamStart() {
/*
* Not necessary to call this since the streamers will create a data unit, which get's
* saved to the database as soon as initialisation is complete.
*/
if (!arrayDataSaved) {
// saveArrayData();
}
}
@Override
public void pamStop() {
// TODO Auto-generated method stub
}
@Override
public void addOutputDataBlock(PamDataBlock outputDataBlock){
AbstractScrollManager.getScrollManager().addToSpecialDatablock(outputDataBlock, 60000, 0);
super.addOutputDataBlock(outputDataBlock);
}
@Override
public void pamStart() {
/*
* Not necessary to call this since the streamers will create a data unit, which get's
* saved to the database as soon as initialisation is complete.
/**
* @return the streamerDataBlock
*/
if (!arrayDataSaved) {
// saveArrayData();
protected StreamerDataBlock getStreamerDataBlock() {
return streamerDataBlock;
}
}
@Override
public void pamStop() {
// TODO Auto-generated method stub
/**
* Save all the array data to the database. This get's called when
* the array manager dialog has been called or when PAMGuard starts to ensure
* that there is a database record of how the hydrophones were arranged. <p>
* This may cause trouble in offline analysis if you want to make changes to the phone layout
* (for example changing a hydrophone separation).
*/
public void createArrayData() {
// DBControlUnit dbControl = DBControlUnit.findDatabaseControl();
// DBProcess dbProcess = null;
// if (dbControl != null) {
// dbProcess = dbControl.getDbProcess();
// }
long timeNow = PamCalendar.getTimeInMillis();
createDefaultStreamerUnits(timeNow);
createDefaultHydrophoneUnits(timeNow);
}
/**
* @return the streamerDataBlock
*/
protected StreamerDataBlock getStreamerDataBlock() {
return streamerDataBlock;
}
/**
* Save all the array data to the database. This get's called when
* the array manager dialog has been called or when PAMGuard starts to ensure
* that there is a database record of how the hydrophones were arranged. <p>
* This may cause trouble in offline analysis if you want to make changes to the phone layout
* (for example changing a hydrophone separation).
*/
public void createArrayData() {
// DBControlUnit dbControl = DBControlUnit.findDatabaseControl();
// DBProcess dbProcess = null;
// if (dbControl != null) {
// dbProcess = dbControl.getDbProcess();
// }
long timeNow = PamCalendar.getTimeInMillis();
createDefaultStreamerUnits(timeNow);
createDefaultHydrophoneUnits(timeNow);
arrayDataSaved = true;
}
public int createDefaultStreamerUnits(long timeNow) {
PamArray currentArray = arrayManager.getCurrentArray();
if (currentArray == null) {
return 0;
arrayDataSaved = true;
}
int n = currentArray.getNumStreamers();
Streamer s;
StreamerDataUnit sdu;
StreamerDataBlock sdb = arrayManager.getStreamerDatabBlock();
for (int i = 0; i < n; i++) {
if (sdb.getPreceedingUnit(timeNow,1<<i)==null){
s = currentArray.getStreamer(i);
sdu = new StreamerDataUnit(timeNow, s);
public int createDefaultStreamerUnits(long timeNow) {
PamArray currentArray = arrayManager.getCurrentArray();
if (currentArray == null) {
return 0;
}
int n = currentArray.getNumStreamers();
Streamer s;
StreamerDataUnit sdu;
StreamerDataBlock sdb = arrayManager.getStreamerDatabBlock();
for (int i = 0; i < n; i++) {
if (sdb.getPreceedingUnit(timeNow,1<<i)==null){
s = currentArray.getStreamer(i);
sdu = new StreamerDataUnit(timeNow, s);
if (getPamControlledUnit().isViewer()) {
// give it a face index to stop it saving every time viewere is opened.
sdu.setDatabaseIndex(-1);
}
streamerDataBlock.addPamData(sdu);
}
}
return n;
}
public int createDefaultHydrophoneUnits(long timeNow) {
PamArray currentArray = arrayManager.getCurrentArray();
if (currentArray == null) {
return 0;
}
int n = currentArray.getHydrophoneCount();
Hydrophone h;
HydrophoneDataUnit hdu;
for (int i = 0; i < n; i++) {
h = currentArray.getHydrophone(i);
hdu = new HydrophoneDataUnit(timeNow, h);
if (getPamControlledUnit().isViewer()) {
// give it a face index to stop it saving every time viewere is opened.
sdu.setDatabaseIndex(-1);
hdu.setDatabaseIndex(-1);
}
streamerDataBlock.addPamData(sdu);
hydrophoneDataBlock.addPamData(hdu);
}
}
return n;
}
public int createDefaultHydrophoneUnits(long timeNow) {
PamArray currentArray = arrayManager.getCurrentArray();
if (currentArray == null) {
return 0;
}
int n = currentArray.getHydrophoneCount();
Hydrophone h;
HydrophoneDataUnit hdu;
for (int i = 0; i < n; i++) {
h = currentArray.getHydrophone(i);
hdu = new HydrophoneDataUnit(timeNow, h);
if (getPamControlledUnit().isViewer()) {
// give it a face index to stop it saving every time viewere is opened.
hdu.setDatabaseIndex(-1);
}
hydrophoneDataBlock.addPamData(hdu);
return n;
}
return n;
}
/**
* @return the hydrophoneDataBlock
*/
protected HydrophoneDataBlock getHydrophoneDataBlock() {
return hydrophoneDataBlock;
}
/**
* @return the hydrophoneDataBlock
*/
protected HydrophoneDataBlock getHydrophoneDataBlock() {
return hydrophoneDataBlock;
}
/**
* @return the hydrophoneSQLlogging
*/
protected HydrophoneSQLLogging getHydrophoneSQLlogging() {
return hydrophoneSQLlogging;
}
/**
* @return the hydrophoneSQLlogging
*/
protected HydrophoneSQLLogging getHydrophoneSQLlogging() {
return hydrophoneSQLlogging;
}
}

View File

@ -0,0 +1,72 @@
package Array;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import PamView.dialog.PamGridBagContraints;
import PamView.panel.WestAlignedPanel;
/**
* Instrument identity panel, contrians additional fields required by Tethys.
* @author dg50
*
*/
public class InstrumentIdentityPanel {
private JPanel mainPanel;
private JTextField instrumentId;
private JTextField instrumentType;
public InstrumentIdentityPanel() {
mainPanel = new WestAlignedPanel();
mainPanel.setBorder(new TitledBorder("Instrument information"));
mainPanel.setLayout(new GridBagLayout());
GridBagConstraints c = new PamGridBagContraints();
mainPanel.add(new JLabel("Instrument Type ", JLabel.RIGHT), c);
c.gridx++;
mainPanel.add(instrumentType = new JTextField(20), c);
c.gridx = 0;
c.gridy++;
mainPanel.add(new JLabel("Instrument Id ", JLabel.RIGHT), c);
c.gridx++;
mainPanel.add(instrumentId = new JTextField(20), c);
instrumentType.setToolTipText("Instrument type, e.g. Towed array, HARP, EAR, Popup, DMON, Rock Hopper, etc.");
instrumentId.setToolTipText("Instrument identifier, e.g. serial number");
}
public JComponent getComponent() {
return mainPanel;
}
public void setParams(PamArray currentArray) {
if (currentArray == null) {
currentArray = ArrayManager.getArrayManager().getCurrentArray();
}
if (currentArray == null) {
return;
}
instrumentType.setText(currentArray.getInstrumentType());
instrumentId.setText(currentArray.getInstrumentId());
}
public void getParams(PamArray currentArray) {
if (currentArray == null) {
currentArray = ArrayManager.getArrayManager().getCurrentArray();
}
if (currentArray == null) {
return;
}
currentArray.setInstrumentType(instrumentType.getText());
currentArray.setInstrumentId(instrumentId.getText());
}
}

View File

@ -16,5 +16,10 @@ abstract public class MovingHydrophoneLocator extends SimpleHydrophoneLocator {
super(pamArray, streamer);
}
@Override
public boolean isChangeable() {
return true;
}
}

View File

@ -35,6 +35,7 @@ import Array.streamerOrigin.StreamerDataIterator;
import GPS.GpsData;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
import PamUtils.LatLong;
import PamUtils.PamArrayUtils;
@ -91,6 +92,33 @@ public class PamArray implements Serializable, Cloneable, ManagedParameters {
private String arrayName;
private String arrayFile;
/**
* Type, used for Tethys and other meta data control
*/
private String instrumentType;
/**
* Array Id. Can be anything. Compulsory for Tethys.
*/
private String instrumentId;
public String getInstrumentType() {
return instrumentType;
}
public void setInstrumentType(String instrumentType) {
this.instrumentType = instrumentType;
}
public String getInstrumentId() {
return instrumentId;
}
public void setInstrumentId(String instrumentId) {
this.instrumentId = instrumentId;
}
// private int originInterpolation = ORIGIN_USE_LATEST;
private int originInterpolation = ORIGIN_USE_PRECEEDING;
@ -1578,7 +1606,7 @@ public class PamArray implements Serializable, Cloneable, ManagedParameters {
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
try {
Field field = this.getClass().getDeclaredField("streamers");
ps.put(new PrivatePamParameterData(this, field) {

View File

@ -25,6 +25,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
/**
*
@ -79,7 +80,7 @@ public class Preamplifier implements Serializable, Cloneable, ManagedParameters
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -17,6 +17,7 @@ import PamController.PamController;
import PamController.masterReference.MasterReferencePoint;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
import PamUtils.LatLong;
import PamUtils.PamCalendar;
@ -767,7 +768,7 @@ public class Streamer implements Serializable, Cloneable, ManagedParameters {
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
try {
Field field = this.getClass().getDeclaredField("coordinate");
ps.put(new PrivatePamParameterData(this, field) {

View File

@ -259,6 +259,7 @@ public class StreamerDialog extends PamDialog {
// }
singleInstance.currentArray = currentArray;
singleInstance.defaultStreamer = streamer;//.clone();
// singleInstance.st
singleInstance.setParams();
singleInstance.setVisible(true);
return singleInstance.defaultStreamer;
@ -552,6 +553,17 @@ public class StreamerDialog extends PamDialog {
pack();
}
}
try {
OriginSettings os = defaultStreamer.getOriginSettings(currentOriginMethod.getClass());
if (os != null) {
currentOriginMethod.setOriginSettings(os);
}
}
catch (Exception e) {
// will throw if it tries to set the wrong type of settings.
}
enableControls();
}

View File

@ -3,6 +3,7 @@ package Array.streamerOrigin;
import PamController.SettingsObject;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
/**
* Class to hold settings for the different origin methods.
@ -47,7 +48,7 @@ public abstract class OriginSettings implements SettingsObject, Cloneable, Manag
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -5,6 +5,7 @@ import java.util.Arrays;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import mcc.MccJniInterface;
import mcc.mccjna.MCCConstants;
@ -67,7 +68,7 @@ public class ArrayAccelParams implements Serializable, Cloneable, ManagedParamet
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -5,6 +5,7 @@ import java.lang.reflect.Field;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
import PamView.GroupedSourceParameters;
import PamguardMVC.PamConstants;
@ -44,7 +45,7 @@ public class AzigramParameters implements Serializable, ManagedParameters, Clone
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
try {
Field field = this.getClass().getDeclaredField("name");
ps.put(new PrivatePamParameterData(this, field) {

View File

@ -7,6 +7,7 @@ import org.w3c.dom.Element;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
/**
* FilterPArameters for use when the filter is on it's own (within a FilterController)
@ -39,7 +40,7 @@ public class FilterParameters_2 implements Serializable, Cloneable, ManagedParam
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -30,6 +30,7 @@ import org.w3c.dom.Element;
import PamController.PamControlledUnit;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamUtils.FrequencyFormat;
/**
@ -358,7 +359,7 @@ public class FilterParams implements Serializable, Cloneable, ManagedParameters
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -5,6 +5,7 @@ import java.lang.reflect.Field;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
public class GPSParameters implements Serializable, Cloneable, ManagedParameters {
@ -175,7 +176,7 @@ public class GPSParameters implements Serializable, Cloneable, ManagedParameters
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
try {
Field field = this.getClass().getDeclaredField("nmeaSource");
ps.put(new PrivatePamParameterData(this, field) {

View File

@ -1,5 +1,6 @@
package GPS;
import PamUtils.PamCalendar;
import PamguardMVC.PamDataUnit;
public class GpsDataUnit extends PamDataUnit {
@ -52,12 +53,18 @@ public class GpsDataUnit extends PamDataUnit {
*/
@Override
public String getSummaryString() {
// TODO Auto-generated method stub
String str = super.getSummaryString();
// String str = super.getSummaryString();
String str = String.format("<html>%s<br>UID:%d, Database: %d<br>%s<br>",
"GPS Data", getUID(), getDatabaseIndex(), PamCalendar.formatDBDateTime(getTimeMilliseconds(), true));
if (gpsData != null) {
str += gpsData.summaryString();
}
return str;
}
@Override
public double[] getFrequency() {
return null;
}
}

View File

@ -295,7 +295,8 @@ public class GpsLogger extends SQLLogging {
* time from the UTC column which is NOT the GpsData time which was the real GPS time.
*/
int gpsIntTimeVal = gpsTime.getIntegerValue();
Object ts = getTableDefinition().getTimeStampItem().getValue();
PamTableDefinition pamTableDef = (PamTableDefinition) getTableDefinition();
Object ts = pamTableDef.getTimeStampItem().getValue();
long gpsDate = sqlTypes.millisFromTimeStamp(ts);
if (gpsDate%1000 == 0) {
// some databases may have stored the milliseconds, in which

View File

@ -17,6 +17,7 @@ import java.lang.reflect.Field;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PrivatePamParameterData;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamView.GroupedSourceParameters;
public class IshDetParams implements Serializable, Cloneable, ManagedParameters {
@ -96,7 +97,7 @@ public class IshDetParams implements Serializable, Cloneable, ManagedParameters
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
try {
Field field = this.getClass().getDeclaredField("inputDataSource");
ps.put(new PrivatePamParameterData(this, field) {

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
/**
* Ishamel display parameters for the Spectrogram plug in.
@ -42,7 +43,7 @@ public class IshDisplayParams implements Serializable, Cloneable, ManagedParamet
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DISPLAY);
return ps;
}

View File

@ -8,14 +8,13 @@ import java.sql.Types;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import generalDatabase.EmptyTableDefinition;
//import pamDatabase.SQLLogging;
//import PamguardMVC.RecyclingDataBlock;
import generalDatabase.PamDetectionLogging;
public class IshLogger extends PamDetectionLogging {
IshDetControl ishDetControl;
PamTableDefinition tableDefinition;
PamTableItem systemDate, durationSecs, secSinceStart, peakHeight;
// Peak is more important than start time for matched filter & spectrogram correlation
PamTableItem peakSample, peakDelaySecs;
@ -25,7 +24,7 @@ public class IshLogger extends PamDetectionLogging {
super(pamDataBlock, UPDATE_POLICY_WRITENEW);
this.ishDetControl = ishDetControl;
tableDefinition = getTableDefinition();
EmptyTableDefinition tableDefinition = getTableDefinition();
// PamTableItem tableItem;
// setUpdatePolicy(UPDATE_POLICY_WRITENEW);

View File

@ -14,14 +14,13 @@ import IshmaelDetector.IshDetection;
import PamUtils.LatLong;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import generalDatabase.EmptyTableDefinition;
//import pamDatabase.SQLLogging;
//import PamguardMVC.RecyclingDataBlock;
import generalDatabase.PamDetectionLogging;
public class IshLocSqlLogging extends PamDetectionLogging {
IshLocControl ishLocControl;
PamTableDefinition tableDefinition;
PamTableItem systemDate, durationSecs, secSinceStart, peakHeight;
private PamTableItem latitude, longitude, refLatitude, refLongitude, x, y, z;
@ -30,7 +29,7 @@ public class IshLocSqlLogging extends PamDetectionLogging {
super(pamDataBlock, UPDATE_POLICY_WRITENEW);
this.ishLocControl = ishDetControl;
tableDefinition = getTableDefinition();
EmptyTableDefinition tableDefinition = getTableDefinition();
tableDefinition.addTableItem(latitude = new PamTableItem("Latitude", Types.DOUBLE));
tableDefinition.addTableItem(longitude = new PamTableItem("Longitude", Types.DOUBLE));
tableDefinition.addTableItem(refLatitude = new PamTableItem("ReferenceLatitude", Types.DOUBLE));

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
public class KernelSmoothingParameters implements Serializable, Cloneable, ManagedParameters {
@ -25,7 +26,7 @@ public class KernelSmoothingParameters implements Serializable, Cloneable, Manag
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import fftFilter.FFTFilterParams;
/**
@ -157,7 +158,7 @@ public class DelayMeasurementParams implements Serializable, Cloneable, ManagedP
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
/**
* Paramters for running a Marklov chain Monte Carlo algorithm.
@ -141,7 +142,7 @@ public class MCMCParams2 implements Serializable, Cloneable, ManagedParameters
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
public class MCMCParams implements Serializable, Cloneable, ManagedParameters {
@ -64,7 +65,7 @@ public class MCMCParams implements Serializable, Cloneable, ManagedParameters {
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
/**
@ -69,7 +70,7 @@ public class HyperbolicParams implements Serializable, Cloneable, ManagedParamet
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import Spectrogram.WindowFunction;
/**
@ -104,7 +105,7 @@ public class RawOrFFTParams implements Serializable, Cloneable, RawOrFFTParamsIn
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -85,7 +85,15 @@ public class GebcoMapFile implements MapFileManager {
* @see Map.MapFile#readFileData(java.io.File)
*/
public boolean readFileData(File file) {
return readMapFile(file, true);
try {
return readMapFile(file, true);
}
catch (Exception e) {
// trap error someone reported at end November 22. Suspect it was their corrupt map file causing problems.
String err = String.format("Map file %s is missing or corrupt and cannot be loaded", file.getName());
WarnOnce.showWarning("Map File Error", err, WarnOnce.OK_OPTION);
return false;
}
}
private boolean readMapFile(File gebcoFile, boolean readContours) {

View File

@ -7,6 +7,7 @@ import java.util.ListIterator;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
/**
* PArameters for MapDetectionsManager which
@ -65,7 +66,7 @@ public class MapDetectionsParameters implements Serializable, Cloneable, Managed
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DISPLAY);
return ps;
}

View File

@ -1096,6 +1096,7 @@ public class MapPanel extends JPanelWithPamKey implements PamObserver, ColorMana
return;
}
ds = dataBlock.getDataSelector(simpleMapRef.getUnitName(), false, DATASELECTNAME);
// ds = null;
ArrayList<PamDataUnit> dataCopy = dataBlock.getDataCopy(earliestToPlot, now, true, ds);
duIterator = dataCopy.listIterator();
while (duIterator.hasNext()) {

View File

@ -27,6 +27,7 @@ import java.lang.reflect.Field;
import Array.Hydrophone;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamModel.parametermanager.PrivatePamParameterData;
public class MapParameters implements Serializable, Cloneable, ManagedParameters {
@ -301,7 +302,7 @@ public class MapParameters implements Serializable, Cloneable, ManagedParameters
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DISPLAY);
return ps;
}

View File

@ -20,9 +20,15 @@
*/
package Map;
import java.awt.Point;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.AffineTransform;
import java.util.ListIterator;
import GPS.GPSControl;
import GPS.GPSDataBlock;
import GPS.GpsDataUnit;
import PamController.PamController;
import PamUtils.Coordinate3d;
import PamUtils.LatLong;
import PamUtils.PamCoordinate;
@ -385,6 +391,45 @@ public class MapRectProjector extends MapProjector {
return xTrans;
}
@Override
public String getHoverText(Point mousePoint, int ploNumberMatch) {
String text = super.getHoverText(mousePoint, ploNumberMatch);
if (text == null) {
return findGpsTrackText(mousePoint, ploNumberMatch);
}
else {
return text;
}
}
private String findGpsTrackText(Point mousePoint, int ploNumberMatch) {
GPSControl gpsControl = GPSControl.getGpsControl();
if (gpsControl == null || mousePoint == null) {
return null;
}
LatLong currentPos = getDataPosition(new Coordinate3d(mousePoint.x, mousePoint.y));
GPSDataBlock gpsDataBlock = gpsControl.getGpsDataBlock();
double dist = Double.MAX_VALUE;
GpsDataUnit closest = null;
ListIterator<GpsDataUnit> it = gpsDataBlock.getListIterator(0);
while (it.hasNext()) {
GpsDataUnit gpsUnit = it.next();
double r = gpsUnit.getGpsData().distanceToMetres(currentPos);
if (r < dist) {
dist = r;
closest = gpsUnit;
}
}
if (closest == null) {
return null;
}
double rPix = dist*this.pixelsPerMetre;
if (rPix > 20) {
return null;
}
return closest.getSummaryString();
}
}

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
public class GridbaseParameters implements Cloneable, Serializable, ManagedParameters {
@ -25,7 +26,7 @@ public class GridbaseParameters implements Cloneable, Serializable, ManagedParam
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DISPLAY);
return ps;
}

View File

@ -24,6 +24,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import serialComms.jserialcomm.PJSerialComm;
public class NMEAParameters implements Serializable, Cloneable, ManagedParameters {
@ -149,7 +150,7 @@ public class NMEAParameters implements Serializable, Cloneable, ManagedParameter
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -33,6 +33,13 @@ public interface OfflineDataStore {
*/
public String getDataSourceName();
/**
* Get the data location. This may be a specific file, or might be a folder
* if data are in many files, a URI, etc.
* @return store locations
*/
public String getDataLocation();
/**
* Load data for a given datablock between two time limits.
* @param dataBlock datablock owner of the data

View File

@ -23,6 +23,7 @@ package PamController;
import java.awt.Component;
import java.awt.Frame;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JMenu;
@ -30,16 +31,14 @@ import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import offlineProcessing.OfflineTask;
import offlineProcessing.OfflineTaskGroup;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import PamController.status.ModuleStatus;
import PamController.status.ModuleStatusManager;
import PamController.status.ProcessCheck;
import PamModel.PamModel;
import PamModel.PamModuleInfo;
import PamModel.PamPluginInterface;
import PamView.ClipboardCopier;
import PamView.PamGui;
import PamView.PamSidePanel;
@ -845,6 +844,16 @@ public abstract class PamControlledUnit implements SettingsNameProvider {
}
return worstStatus;
}
/**
* Get the offline state of this module. This can generally
* be idle, but can be a higher state when map making at startup
* and when running an offline task.
* @return
*/
public int getOfflineState() {
return PamController.PAM_IDLE;
}
// /**
// * Get a list of available offline tasks for this module. This is mostly used for tasks that
@ -880,6 +889,53 @@ public abstract class PamControlledUnit implements SettingsNameProvider {
public int getInstanceIndex() {
return instanceIndex;
}
/**
* Get detail if this is a plugin.
* @return plugin detail, or null if it's not a plugin.
*/
public PamPluginInterface getPlugin() {
List<PamPluginInterface> pluginList = ((PamModel) PamController.getInstance().getModelInterface()).getPluginList();
if (pluginList == null) {
return null;
}
for (PamPluginInterface plugin : pluginList) {
if (plugin.getClassName().equals(this.getClass().getName())) {
return plugin;
}
}
return null;
}
/**
* The PamConfiguration holds the master list of modules which form part of a
* configuration. It should be accessed to find list of datablocks, etc. rather than
* doing everything through PAMController whenever possible.
* @return the pamConfiguration
*/
public PamConfiguration getPamConfiguration() {
if (pamConfiguration == null) {
pamConfiguration = PamController.getInstance().getPamConfiguration();
}
return pamConfiguration;
}
/**
* Is this module in the main configuration. If it isn't then it's probably a dummy config
* used in the batch processor or for importing / exporting configs, so it should be stopped from
* doing too much !
* @return
*/
public boolean isInMainConfiguration() {
return pamConfiguration == PamController.getInstance().getPamConfiguration();
}
/**
* @param pamConfiguration the pamConfiguration to set
*/
public void setPamConfiguration(PamConfiguration pamConfiguration) {
this.pamConfiguration = pamConfiguration;
}
/**
* The PamConfiguration holds the master list of modules which form part of a

View File

@ -36,6 +36,7 @@ import org.apache.commons.io.input.ClassLoaderObjectInputStream;
import PamModel.PamModel;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamView.dialog.warn.WarnOnce;
@ -398,8 +399,13 @@ public class PamControlledUnitSettings implements Serializable, ManagedParameter
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}
@Override
public String toString() {
return String.format("Type %s; Name %s, Data ", getUnitType(), getUnitName()) + getSettings();
}
}

View File

@ -37,6 +37,7 @@ import javax.swing.ToolTipManager;
import com.jcraft.jsch.ConfigRepository.Config;
import com.sun.xml.bind.v2.TODO;
import Acquisition.AcquisitionControl;
import Acquisition.AcquisitionProcess;
//import com.sun.org.apache.xerces.internal.dom.DocumentImpl;
@ -57,6 +58,7 @@ import fftManager.FFTDataUnit;
import generalDatabase.DBControlUnit;
import javafx.application.Platform;
import javafx.stage.Stage;
import metadata.MetaDataContol;
import Array.ArrayManager;
import PamController.command.MulticastController;
import PamController.command.NetworkController;
@ -64,6 +66,7 @@ import PamController.command.TerminalController;
import PamController.command.WatchdogComms;
import PamController.fileprocessing.ReprocessManager;
import PamController.masterReference.MasterReferencePoint;
import PamController.settings.BatchViewSettingsImport;
import PamController.settings.output.xml.PamguardXMLWriter;
import PamController.settings.output.xml.XMLWriterDialog;
import PamController.soundMedium.GlobalMediumManager;
@ -123,6 +126,12 @@ public class PamController implements PamControllerInterface, PamSettings {
public static final int PAM_INITIALISING = 4;
public static final int PAM_STOPPING = 5;
public static final int PAM_COMPLETE = 6;
public static final int PAM_MAPMAKING = 7;
public static final int PAM_OFFLINETASK = 8;
public static final int BUTTON_START = 1;
public static final int BUTTON_STOP = 2;
private volatile int lastStartStopButton = 0;
// status' for RunMode = RUN_PAMVIEW
public static final int PAM_LOADINGDATA = 2;
@ -156,7 +165,7 @@ public class PamController implements PamControllerInterface, PamSettings {
/**
* The current PAM status
*/
private transient int pamStatus = PAM_IDLE;
private volatile int pamStatus = PAM_IDLE;
/**
* PamGuard view params.
@ -186,6 +195,8 @@ public class PamController implements PamControllerInterface, PamSettings {
private static PamController uniqueController;
private Timer diagnosticTimer;
private boolean debugDumpBufferAtRestart = false;
private NetworkController networkController;
private int nNetPrepared;
@ -234,6 +245,10 @@ public class PamController implements PamControllerInterface, PamSettings {
*/
private Thread statusCheckThread;
private WaitDetectorThread detectorEndThread;
private boolean firstDataLoadComplete;
// keep a track of the total number of times PAMGuard is started for debug purposes.
private int nStarts;
private RestartRunnable restartRunnable;
private PamController(int runMode, Object object) {
@ -436,7 +451,7 @@ public class PamController implements PamControllerInterface, PamSettings {
// addModule(mi, "Temporary Database");
// }
// Add a note to the putput console for the user to ignore the SLF4J warning (see http://www.slf4j.org/codes.html#StaticLoggerBinder
// Add a note to the output console for the user to ignore the SLF4J warning (see http://www.slf4j.org/codes.html#StaticLoggerBinder
// for details). I spent a few hours trying to get rid of this warning, but without any luck. If you do a google search
// there are a lot of forum suggestions on how to fix, but none seemed to work for me. Added both slf4j-nop and
// slf4j-simple to dependency list, neither made a difference. Changed order of dependencies, ran purges and updates,
@ -452,6 +467,7 @@ public class PamController implements PamControllerInterface, PamSettings {
System.out.println("");
System.out.println("Note - ignore the following SLF4J warn/error messages, they are not applicable to this application");
ArrayManager.getArrayManager(); // create the array manager so that it get's it's settings
MetaDataContol.getMetaDataControl();
/**
* Check for archived files and unpack automatically.
@ -490,17 +506,31 @@ public class PamController implements PamControllerInterface, PamSettings {
addView(guiFrameManager.initPrimaryView(this, pamModelInterface));
}
/**
* Calling this will cause a callback to this.restoreSettings which
* includes a list of modules which will then get created, and in turn
* load all of their own settings from the settings manager.
*/
PamSettingManager.getInstance().registerSettings(this);
/**
* For offline batch processing a few funnies happen here. We'll be open
* in viewer mode, but it's likely a psf will have been passed as an input argument.
* We will therefore have to extract all the modules from that psfx as well and either
* add them as new modules, or get their settings and use those to update existing settings
* That should probably be done here before the final calls to setup processes, etc.
*/
if (getRunMode() == RUN_PAMVIEW && PamSettingManager.remote_psf != null) {
loadOtherSettings(PamSettingManager.remote_psf);
}
/*
* Get any other required modules for this run mode.
*/
pamModelInterface.startModel();
setupProcesses();
// if (getRunMode() == RUN_PAMVIEW) {
// createViewerStatusBar();
// pamControlledUnits.add(new OfflineProcessingControlledUnit("OfflineProcessing"));
// }
/*
* We are running as a remote application, start process straight away!
*/
@ -571,6 +601,7 @@ public class PamController implements PamControllerInterface, PamSettings {
// });
}
/**
* Clear all data selectors and symbol managers. Required since some of these will have loaded as various modules were created,
* but may also require additional data selectors and symbol managers from super detections which were not availble.
@ -583,6 +614,11 @@ public class PamController implements PamControllerInterface, PamSettings {
}
/**
* This gets called after other data initialisation tasks (such as data mapping).
* @author dg50
*
*/
class DataInitialised implements Runnable {
@Override
public void run() {
@ -1018,8 +1054,45 @@ public class PamController implements PamControllerInterface, PamSettings {
*/
public void restartPamguard() {
pamStop();
startLater();
/*
* launch a restart thread, that won't do ANYTHING until
* PAMGuard is really idle and buffers are cleared. Can only
* have one of these at a time !
*/
if (restartRunnable != null) {
System.out.println("Warning !!!! PAMGuard is already trying to restart!");
return;
}
restartRunnable = new RestartRunnable();
Thread restartThread = new Thread(restartRunnable, "RestartPAMGuard Thread");
restartThread.run();
}
private class RestartRunnable implements Runnable {
@Override
public void run() {
long t1 = System.currentTimeMillis();
while (getPamStatus() != PAM_IDLE) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
}
long t2 = System.currentTimeMillis();
restartRunnable = null;
System.out.printf("PAMGuard safe to restart after %d milliseconds\n", t2-t1);
startLater(false);
}
}
/**
* calls pamStart using the SwingUtilities
* invokeLater command to start PAMGAURD
@ -1051,7 +1124,13 @@ public class PamController implements PamControllerInterface, PamSettings {
@Override
public void run() {
pamStart(saveSettings);
/*
* do a final check that the stop button hasn't been pressed - can arrive a bit
* late if the system was continually restarting.
*/
if (lastStartStopButton != BUTTON_STOP) {
pamStart(saveSettings);
}
}
}
@ -1076,6 +1155,26 @@ public class PamController implements PamControllerInterface, PamSettings {
}
}
/**
* Called from the start button. A little book keeping
* to distinguish this from automatic starts / restarts
* @return true if started.
*/
@Override
public boolean manualStart() {
lastStartStopButton = BUTTON_START;
return pamStart();
}
/**
* Called from the stop button. A little book keeping
* to distinguish this from automatic starts / restarts
*/
@Override
public void manualStop() {
lastStartStopButton = BUTTON_STOP;
pamStop();
}
/**
* Start PAMGUARD. This function also gets called from the
@ -1161,9 +1260,17 @@ public class PamController implements PamControllerInterface, PamSettings {
}
if (saveSettings) {
startTime = PamCalendar.getSessionStartTime();
// System.out.printf("Saving settings for start time %s\n", PamCalendar.formatDBDateTime(startTime));
saveSettings(PamCalendar.getSessionStartTime());
}
if (++nStarts > 1 && debugDumpBufferAtRestart) {
// do this here - all processses should have reset buffers to start again by now.
String msg = String.format("Starting PAMGuard go %d", nStarts);
dumpBufferStatus(msg, false);
}
StorageOptions.getInstance().setBlockOptions();
t1 = System.currentTimeMillis();
@ -1225,6 +1332,7 @@ public class PamController implements PamControllerInterface, PamSettings {
}
}
dumpBufferStatus("In stopping", false);
/*
* now launch another thread to wait for everything to have stopped, but
* leave this function so that AWT is released and graphics can update, the
@ -1252,9 +1360,11 @@ public class PamController implements PamControllerInterface, PamSettings {
long t2 = System.currentTimeMillis();
if (t2 - t1 > 5000) {
System.out.printf("Stopping, but stuck in loop for CheckRunStatus for %3.1fs\n", (double) (t2-t1)/1000.);
dumpBufferStatus("Stopping stuck in loop", false);
break; // crap out anyway.
}
try {
Thread.sleep(10);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
@ -1265,19 +1375,43 @@ public class PamController implements PamControllerInterface, PamSettings {
}
/**
* Look in every data block, particularly threaded ones, and dump
* the buffer status. This will have to go via PamProcess so that
* additional information can be added from any processes that
* hold additional data in other internal buffers.
* @param message Message to print prior to dumping buffers for debug.
* @param sayEmpties dump info even if a buffer is empty (otherwise, only ones that have stuff still)
*/
public void dumpBufferStatus(String message, boolean sayEmpties) {
if (debugDumpBufferAtRestart == false) return;
System.out.println("**** Dumping process buffer status: " + message);
ArrayList<PamControlledUnit> pamControlledUnits = pamConfiguration.getPamControlledUnits();
for (PamControlledUnit aUnit : pamControlledUnits) {
int numProcesses = aUnit.getNumPamProcesses();
for (int i=0; i<numProcesses; i++) {
PamProcess aProcess = aUnit.getPamProcess(i);
aProcess.dumpBufferStatus(message, sayEmpties);
}
}
System.out.println("**** End of process buffer dump: " + message);
}
/**
* Called once the detectors have actually stopped and puts a few finalising
* functions into the AWT thread.
*/
private void finishStopping() {
detectorEndThread = null;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// this was never getting invoked for some reason.
// SwingUtilities.invokeLater(new Runnable() {
//
// @Override
// public void run() {
pamStopped();
}
});
// }
// });
}
@ -1291,6 +1425,8 @@ public class PamController implements PamControllerInterface, PamSettings {
* it is necessary to make sure that all internal datablock
* buffers have had time to empty.
*/
System.out.println("Arrived in PamStopped() in thread " + Thread.currentThread().toString());
ArrayList<PamControlledUnit> pamControlledUnits = pamConfiguration.getPamControlledUnits();
if (PamModel.getPamModel().isMultiThread()) {
@ -1298,7 +1434,7 @@ public class PamController implements PamControllerInterface, PamSettings {
pamControlledUnits.get(iU).flushDataBlockBuffers(2000);
}
}
setPamStatus(PAM_IDLE);
dumpBufferStatus("In pamStopped, now idle", true);
// wait here until the status has changed to Pam_Idle, so that we know
// that we've really finished processing all data
@ -1319,6 +1455,11 @@ public class PamController implements PamControllerInterface, PamSettings {
}
guiFrameManager.pamEnded();
long stopTime = PamCalendar.getTimeInMillis();
saveEndSettings(stopTime);
setPamStatus(PAM_IDLE);
// no good having this here since it get's called at the end of every file.
// if (GlobalArguments.getParam(PamController.AUTOEXIT) != null) {
//// can exit here, since we've auto started, can auto exit.
@ -1437,6 +1578,26 @@ public class PamController implements PamControllerInterface, PamSettings {
pamConfiguration.saveSettings(timeNow);
}
/**
* Gets called in pamStart and may / will attempt to store all
* PAMGUARD settings via the database and binary storage modules.
*/
private void saveEndSettings(long timeNow) {
// System.out.printf("Updating settings with end time %s\n", PamCalendar.formatDBDateTime(timeNow));
ArrayList<PamControlledUnit> pamControlledUnits = pamConfiguration.getPamControlledUnits();
PamControlledUnit pcu;
PamSettingsSource settingsSource;
for (int iU = 0; iU < pamControlledUnits.size(); iU++) {
pcu = pamControlledUnits.get(iU);
if (PamSettingsSource.class.isAssignableFrom(pcu.getClass())) {
settingsSource = (PamSettingsSource) pcu;
settingsSource.saveEndSettings(timeNow);
}
}
}
/**
* Export configuration into an XML file
* @param parentFrame
@ -1676,16 +1837,23 @@ public class PamController implements PamControllerInterface, PamSettings {
* Updates the entire datamap.
*/
public void updateDataMap(){
System.out.println("updateDataMap:");
if (DBControlUnit.findDatabaseControl()==null) return;
System.out.println("updateDataMap: 1");
ArrayList<PamDataBlock> datablocks=getDataBlocks() ;
System.out.println("updateDataMap: 2");
DBControlUnit.findDatabaseControl().updateDataMap(datablocks);
if (BinaryStore.findBinaryStoreControl()!=null) {
BinaryStore.findBinaryStoreControl().getDatagramManager().updateDatagrams();
}
System.out.println("updateDataMap: 3");
BinaryStore.findBinaryStoreControl().getDatagramManager().updateDatagrams();
System.out.println("updateDataMap: 4");
notifyModelChanged(PamControllerInterface.EXTERNAL_DATA_IMPORTED);
}
@ -1758,6 +1926,10 @@ public class PamController implements PamControllerInterface, PamSettings {
if (moduleChange(changeType)) {
clearSelectorsAndSymbols();
}
if (changeType == DATA_LOAD_COMPLETE) {
firstDataLoadComplete = true;
}
}
@ -1894,12 +2066,78 @@ public class PamController implements PamControllerInterface, PamSettings {
public void setPamStatus(int pamStatus) {
this.pamStatus = pamStatus;
/*
* This only get's called once when set idle at viewer mode startup.
*/
if (debugDumpBufferAtRestart) {
System.out.printf("******* PamController.setPamStatus to %d, real status is %d set in thread %s\n",
pamStatus, getRealStatus(), Thread.currentThread().toString());
}
if (getRunMode() != RUN_PAMVIEW) {
TopToolBar.enableStartButton(pamStatus == PAM_IDLE);
TopToolBar.enableStopButton(pamStatus == PAM_RUNNING);
}
showStatusWarning(pamStatus);
}
/**
* This was within the StatusCommand class, but useful to have it here since it's needed
* in more than one place. In viewer mode at startup there are a number of things going on
* in different threads, such as the creation of datamaps, and this can (hopefully) handle those bespoke
* goings on.
* @return program status for multithreaded statup tasks.
*/
public int getRealStatus() {
PamController pamController = PamController.getInstance();
if (pamController.isInitializationComplete() == false) {
return PamController.PAM_INITIALISING;
}
int runMode = PamController.getInstance().getRunMode();
if (runMode == PamController.RUN_NETWORKRECEIVER) {
return PamController.PAM_RUNNING;
}
int status = pamController.getPamStatus();
if (status == PamController.PAM_IDLE) {
status = PamController.PAM_IDLE;
}
else {
ArrayList<PamControlledUnit> daqs = PamController.getInstance().findControlledUnits(AcquisitionControl.unitType);
if (daqs != null) for (int i = 0; i < daqs.size(); i++) {
try {
AcquisitionControl daq = (AcquisitionControl) daqs.get(i);
if (daq.isStalled()) {
status = PamController.PAM_STALLED;
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
WatchdogComms watchdogComms = PamController.getInstance().getWatchdogComms();
status = watchdogComms.getModifiedWatchdogState(status);
/*
* This function is now being used in batch processing of offline data, where it may be necessary
* to get status information from many different modules, for example when executing offline tasks
* or just at startup while generating datamaps and datagrams.
* So go through all modules and get the highest state of any of them.
*/
if (getRunMode() == RUN_PAMVIEW) {
if (firstDataLoadComplete == false) {
status = PAM_INITIALISING;
}
try {
for (PamControlledUnit aUnit : pamConfiguration.getPamControlledUnits()) {
status = Math.max(status, aUnit.getOfflineState());
}
}
catch (Exception e) {
//just incase there is a concurrent modification at startup.
}
}
return status;
}
/**
* show a warning when we're waiting for detectors to stop
@ -1928,6 +2166,7 @@ public class PamController implements PamControllerInterface, PamSettings {
statusWarning.setWarningMessage(warningMessage);
statusWarning.setWarnignLevel(1);
warningSystem.addWarning(statusWarning);
// System.out.println(warningMessage);
}
}
@ -2184,6 +2423,31 @@ public class PamController implements PamControllerInterface, PamSettings {
private boolean manualStop;
/**
* Used when in viewer mode and planning batch processing with a modified
* configuration, i.e. the command line has been supplied a normal viewer mode
* database and also a psfx file. The settings from the database will already have
* been loaded, this will load any modules that weren't there and will override all the
* settings in other modules with these ones (except some specials such as data storage locations)
* @param psfxFile Name of additional psfx file.
*/
private boolean loadOtherSettings(String psfxName) {
File psfxFile = new File(psfxName);
if (psfxFile.exists() == false) {
return false;
}
PamSettingsGroup settingsGroup = PSFXReadWriter.getInstance().loadFileSettings(psfxFile);
if (settingsGroup == null) {
return false;
}
BatchViewSettingsImport importer = new BatchViewSettingsImport(this, settingsGroup);
importer.importSettings();
return true;
}
/**
* Called to load a specific set of PAMGUARD settings in
* viewer mode, which were previously loaded in from a
@ -2400,7 +2664,7 @@ public class PamController implements PamControllerInterface, PamSettings {
if (dbc == null) {
return null;
}
return dbc.getDatabaseName();
return dbc.getLongDatabaseName();
}
return null;
}

View File

@ -458,6 +458,17 @@ public interface PamControllerInterface {
* Close all modules and free up resources.
*/
public void pamClose();
/**
* Start function called from button to do a bit of extra book keeping
* @return
*/
public boolean manualStart();
/**
* Stop function called from button to do a bit of extra book keeping
*/
public void manualStop();
//public void controllerAddFileMenuItem();

View File

@ -0,0 +1,20 @@
package PamController;
/**
* Interface to define modules which can be considered as sensors of some sort.
* e.g. depth and orientation modules and the SoundTrap clickdetecotr
* @author dg50
*
*/
public interface PamSensor {
public String getUnitName();
public String getUnitType();
public String getSensorDescription();
public String getSensorId();
}

View File

@ -44,6 +44,7 @@ import javax.swing.plaf.FontUIResource;
import pamViewFX.fxNodes.utilsFX.PamUtilsFX;
import pamViewFX.fxSettingsPanes.SettingsFileDialogFX;
import pamguard.GlobalArguments;
//XMLSettings
//import org.jdom.Document;
@ -383,6 +384,8 @@ public class PamSettingManager {
boolean[] usedSettings, PamSettings user) {
if (settingsList == null) return null;
// go through the list and see if any match this module. Avoid repeats.
// String unitName = user.getUnitName();
// String unitType = user.getUnitType();
for (int i = 0; i < settingsList.size(); i++) {
if (usedSettings != null && usedSettings[i]) continue;
if (isSettingsUnit(user, settingsList.get(i))) {
@ -392,6 +395,7 @@ public class PamSettingManager {
return settingsList.get(i);
}
}
/*
* To improve complex module loading where settings may be saved by multiple sub-modules, in
* July 2015 many modules which had fixed settings had their settings names and types changed !
@ -476,7 +480,7 @@ public class PamSettingManager {
*/
public PamSettings findSettingsOwner(String unitType, String unitName, String unitClassName) {
for (PamSettings owner:owners) {
if (owner.getClass() != null) {
if (owner.getClass() != null && unitClassName != null) {
if (owner.getClass().getName().equals(unitClassName) == false) {
continue;
}
@ -492,7 +496,7 @@ public class PamSettingManager {
/**
* Call just before PAMGUARD exits to save the settings
* either to psf and / or database tables.
* @return true if settings saved sucessfully.
* @return true if settings saved successfully.
*/
public boolean saveFinalSettings() {
int runMode = PamController.getInstance().getRunMode();
@ -1029,8 +1033,9 @@ public class PamSettingManager {
loadingLocalSettings = true;
loadSettingsFileData();
if (PamSettingManager.RUN_REMOTE == false) {
if (PamSettingManager.RUN_REMOTE == false && GlobalArguments.isBatch() == false) {
if (settingsFileData != null) {
TipOfTheDayManager.getInstance().setShowAtStart(settingsFileData.showTipAtStartup);
if (settingsFileData.showTipAtStartup) {
@ -1480,11 +1485,20 @@ public class PamSettingManager {
if (settings.getUnitName() == null || settingsUser.getUnitName() == null) return false;
if (settings.getUnitType() == null || settingsUser.getUnitType() == null) return false;
if (settings.getUnitName().equals(settingsUser.getUnitName())
&& settings.getUnitType().equals(settingsUser.getUnitType())
&& settings.versionNo == settingsUser.getSettingsVersion()){
return true;
/*
* some of the settings names used in Viewer mode have become too long, notably
* in some data selectors which are using a datablocks long data name. This
* screws things up, so moving to a begins with rather than equals for the name.
*/
String name = settingsUser.getUnitName();
String type = settingsUser.getUnitType();
long version = settingsUser.getSettingsVersion();
if (settings.getUnitType().equals(type)
&& settings.versionNo == version){
if (name.startsWith(settings.getUnitName())) {
return true;
}
}
return false;

View File

@ -20,6 +20,14 @@ public interface PamSettingsSource {
*/
public boolean saveStartSettings(long timeNow);
/**
* Save settings when processing ends.
* This may just be an update of the settings saves with saveStartSettings, e.g. an end time.
* @param timeNow
* @return true if saved correctly.
*/
public boolean saveEndSettings(long timeNow);
/**
* Get the number of different settings
* within the settings source.

View File

@ -16,7 +16,7 @@ public class PamguardVersionInfo {
* @return release type
*/
static public ReleaseType getReleaseType() {
return ReleaseType.CORE;
return ReleaseType.OTHER;
}
/**
@ -31,12 +31,12 @@ public class PamguardVersionInfo {
* Version number, major version.minorversion.sub-release.
* Note: can't go higher than sub-release 'f'
*/
static public final String version = "2.02.11b";
static public final String version = "2.02.10b";
/**
* Release date
*/
static public final String date = "10 November 2023";
static public final String date = "2 March 2024";
// /**
// * Release type - Beta or Core

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
/**
* Very simple class used in an ArrayList of used modules that
@ -54,8 +55,16 @@ public class UsedModuleInfo implements Serializable, ManagedParameters {
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}
/**
* Get the unit name of the module being imported.
* @return
*/
public String getUnitName() {
return unitName;
}
}

View File

@ -2,6 +2,7 @@ package PamController.command;
import Acquisition.AcquisitionControl;
import PamController.PamController;
import offlineProcessing.OfflineTaskManager;
import pamViewFX.PamControlledGUIFX;
/**
@ -21,6 +22,19 @@ public class BatchStatusCommand extends ExtCommand {
@Override
public String execute(String command) {
if (PamController.getInstance().getRunMode() == PamController.RUN_NORMAL) {
return getNormalModeStatus(command);
}
else {
return getViewerModeStatus(command);
}
}
private String getViewerModeStatus(String command) {
return OfflineTaskManager.getManager().getBatchStatus();
}
private String getNormalModeStatus(String command) {
AcquisitionControl daqControl = (AcquisitionControl) PamController.getInstance().findControlledUnit(AcquisitionControl.class, null);
if (daqControl == null) {
return null;

View File

@ -31,33 +31,7 @@ public class StatusCommand extends ExtCommand {
private int getRealStatus() {
PamController pamController = PamController.getInstance();
if (pamController.isInitializationComplete() == false) {
return PamController.PAM_INITIALISING;
}
int runMode = PamController.getInstance().getRunMode();
if (runMode == PamController.RUN_NETWORKRECEIVER) {
return PamController.PAM_RUNNING;
}
int status = pamController.getPamStatus();
if (status == PamController.PAM_IDLE) {
status = PamController.PAM_IDLE;
}
else {
ArrayList<PamControlledUnit> daqs = PamController.getInstance().findControlledUnits(AcquisitionControl.unitType);
if (daqs != null) for (int i = 0; i < daqs.size(); i++) {
try {
AcquisitionControl daq = (AcquisitionControl) daqs.get(i);
if (daq.isStalled()) {
status = PamController.PAM_STALLED;
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
WatchdogComms watchdogComms = PamController.getInstance().getWatchdogComms();
return watchdogComms.getModifiedWatchdogState(status);
return pamController.getRealStatus();
}

View File

@ -0,0 +1,155 @@
package PamController.settings;
import java.util.ArrayList;
import PamController.DataInputStore;
import PamController.OfflineDataStore;
import PamController.OfflineFileDataStore;
import PamController.PamControlledUnit;
import PamController.PamControlledUnitSettings;
import PamController.PamController;
import PamController.PamSettingManager;
import PamController.PamSettings;
import PamController.PamSettingsGroup;
import PamController.UsedModuleInfo;
import PamModel.PamModuleInfo;
/**
* A set of functions to handle importing and overriding settings imported from a psfx during
* batch mode processing in viewer mode. Some of this is quite similar to code in SettingsImport
* but different enough that it's easier to have in a separate set of functions.
* @author dg50
*
*/
public class BatchViewSettingsImport {
private PamController pamController;
private PamSettingsGroup settingsGroup;
private SettingsImport settingsImport;
public BatchViewSettingsImport(PamController pamController, PamSettingsGroup settingsGroup) {
this.pamController = pamController;
this.settingsGroup = settingsGroup;
settingsImport = new SettingsImport(pamController);
}
public boolean importSettings() {
// first organise by controlled unit
ArrayList<SettingsImportGroup> moduleGroups = settingsImport.organiseSettingsGroups(settingsGroup.getUnitSettings());
// can now go through those modules and see which exist and which need to be added. Not asking questions, just doing it!
for (SettingsImportGroup moduleGroup : moduleGroups) {
UsedModuleInfo moduleInfo = moduleGroup.getUsedModuleInfo();
PamControlledUnit exModule = pamController.findControlledUnit(moduleInfo.getUnitType(), moduleInfo.getUnitName());
boolean existingStore = false;
if (exModule != null) {
existingStore = isDataStore(exModule);
System.out.printf("Module %s:%s already exists in model (data store: %s)\n", moduleInfo.getUnitType(), moduleInfo.getUnitName(), Boolean.valueOf(existingStore));
}
else {
System.out.printf("Module %s:%s will be added to model\n", moduleInfo.getUnitType(), moduleInfo.getUnitName());
// add the module. No questions asked.
PamModuleInfo pamModuleInfo = moduleGroup.getPamModuleInfo();
if (pamModuleInfo == null) {
System.out.printf("Module %s:%s is not available to this PAMGuard installation\n", moduleInfo.getUnitType(), moduleInfo.getUnitName());
continue;
}
exModule = pamController.addModule(pamModuleInfo, moduleInfo.getUnitName());
}
// set the settings for that module, but only if it's NOT a data storage module.
if (exModule == null) {
continue;
}
// if (exModule.getUnitName().contains("Noise")) {
// System.out.printf("restoring settings for %s, %s\n", exModule.getUnitType(), exModule.getUnitName());
//
// }
if (isDataStore(exModule)) {
System.out.printf("Skip restoring settings for %s, %s\n", exModule.getUnitType(), exModule.getUnitName());
continue;
}
restoreSettings(moduleGroup.getMainSettings());
ArrayList<PamControlledUnitSettings> subSets = moduleGroup.getSubSettings();
if (subSets != null) {
for (PamControlledUnitSettings aSet : subSets) {
restoreSettings(aSet);
}
}
// exModule.notifyModelChanged(PamController.INITIALIZATION_COMPLETE);
// if (exModule.getTabPanel() != null) {
//// exModule.getTabPanel()
// }
}
/*
* Don't need to call this here since it get's called shortly
* from PAMController once all modules are in place.
*/
// pamController.notifyModelChanged(PamController.INITIALIZATION_COMPLETE);
// send out an initialisation complete to help restore settings
// ArrayList<PamControlledUnitSettings> allSettings = settingsGroup.getUnitSettings();
// for (PamControlledUnitSettings aSet : allSettings) {
// PamSettings owner = PamSettingManager.getInstance().findSettingsOwner(aSet.getUnitType(), aSet.getUnitName(), null);
// if (owner == null) {
// System.out.printf("Cannot find owner for %s, %s, %s\n", aSet.getUnitType(), aSet.getUnitName(), aSet.getOwnerClassName());
// }
// else {
// owner.restoreSettings(aSet);
// }
// }
return true;
}
/**
* Find the owner of these settings and send it it's new settings.
* @param aSet
* @return true if found and set sucessfully.
*/
private boolean restoreSettings(PamControlledUnitSettings aSet) {
PamSettings owner = PamSettingManager.getInstance().findSettingsOwner(aSet.getUnitType(), aSet.getUnitName(), null);
if (owner == null) {
System.out.printf("Cannot find owner for %s, %s, %s\n", aSet.getUnitType(), aSet.getUnitName(), aSet.getOwnerClassName());
return false;
}
else {
try {
owner.restoreSettings(aSet);
}
catch (Exception e) {
System.out.printf("Exception restoring settings %s, %s, %s\n", aSet.getUnitType(), aSet.getUnitName(), aSet.getOwnerClassName());
e.printStackTrace();
return false;
}
}
return true;
}
/**
* Is the module a data store. If it is, we probably won't want to copy over it's settings.
* @param controlledUnit PAMGuard module
* @return true if it's data output or input.
*/
private boolean isDataStore(PamControlledUnit controlledUnit) {
return isDataStore(controlledUnit.getClass());
}
/**
* Is the class a data store. If it is, we probably won't want to copy over it's settings.
* @param moduleClass module class
* @return true if it's data output or input.
*/
private boolean isDataStore(Class<? extends PamControlledUnit> moduleClass) {
//OfflineFileDataStore, DataInputStore
if (OfflineDataStore.class.isAssignableFrom(moduleClass)) {
return true;
}
if (DataInputStore.class.isAssignableFrom(moduleClass)) {
return true;
}
return false;
}
}

View File

@ -29,7 +29,10 @@ import PamView.dialog.warn.WarnOnce;
*/
public class SettingsImport {
private PamController pamController;
public SettingsImport(PamController pamController) {
this.pamController = pamController;
}
/**
@ -116,14 +119,16 @@ public class SettingsImport {
*/
private PamControlledUnit importReplace(SettingsImportGroup importGroup, String replaceModule) {
PamControlledUnitSettings mainSet = importGroup.getMainSettings();
PamControlledUnit unit = PamController.getInstance().findControlledUnit(mainSet.getUnitType(), replaceModule);
UsedModuleInfo importInfo = importGroup.getUsedModuleInfo();
PamControlledUnit unit = PamController.getInstance().findControlledUnit(importInfo.getUnitType(), replaceModule);
if (unit == null) {
System.out.println("Unable to find " + mainSet.getUnitType() + " " + mainSet.getUnitName() + " for settings replacement");
System.out.println("Unable to find " + importInfo.getUnitType() + " " + importInfo.getUnitName() + " for settings replacement");
return null;
}
// check we can cast it to PamSettings
if (PamSettings.class.isAssignableFrom(unit.getClass())) {
if (PamSettings.class.isAssignableFrom(unit.getClass()) && mainSet != null) {
try {
mainSet.setUnitName(replaceModule);
((PamSettings) unit).restoreSettings(mainSet);
}
catch (Exception e) {
@ -132,7 +137,7 @@ public class SettingsImport {
System.err.println(e.getMessage());
}
}
loadSubUnitSettings(importGroup, mainSet.getUnitName());
loadSubUnitSettings(importGroup, replaceModule);
return unit;
}
@ -149,7 +154,15 @@ public class SettingsImport {
}
PamSettingManager setManager = PamSettingManager.getInstance();
for (PamControlledUnitSettings pamSettings:subSets) {
PamSettings owner = setManager.findSettingsOwner(pamSettings.getUnitType(), unitName, pamSettings.getOwnerClassName());
/*
* class name in pamSettings is no longer correct, so cannot use pamSettings.getOwnerClassName().
* but the classnames of all the sub modules are unknown (and will be different form the unit class name
* which can be got from importGroup.getPamModuleInfo().getClassName
* so will have to do this only on the unit type and name and hope for no conflicts (catch exception).
*/
// PamModuleInfo moduleInfo = importGroup.getPamModuleInfo();
// String className = moduleInfo.getClassName();
PamSettings owner = setManager.findSettingsOwner(pamSettings.getUnitType(), unitName, null);
if (owner == null) {
System.out.println(String.format("Cannot find settings owner for %s %s in current model", pamSettings.getUnitType(), unitName));
continue;
@ -168,7 +181,8 @@ public class SettingsImport {
private PamControlledUnit importNew(SettingsImportGroup importGroup) {
PamControlledUnitSettings mainSet = importGroup.getMainSettings();
String moduleName = mainSet.getUnitName();
UsedModuleInfo importInfo = importGroup.getUsedModuleInfo();
String moduleName = importInfo.unitName;
// check we've got a name that doesnt' exist and replace it if if does.
// int startChar = 0;
@ -199,11 +213,11 @@ public class SettingsImport {
PamControlledUnit unit = PamController.getInstance().addModule(PamController.getMainFrame(), moduleInfo);
if (unit == null) {
System.out.println("Unable to find " + mainSet.getUnitType() + " " + mainSet.getUnitName() + " for settings replacement");
System.out.println("Unable to find " + importInfo.getUnitType() + " " + importInfo.getUnitName() + " for settings replacement");
return null;
}
// check we can cast it to PamSettings
if (PamSettings.class.isAssignableFrom(unit.getClass())) {
if (PamSettings.class.isAssignableFrom(unit.getClass()) && mainSet != null) {
try {
mainSet.setUnitName(unit.getUnitName()); // need to force the unit name for some modules.
((PamSettings) unit).restoreSettings(mainSet);
@ -224,7 +238,7 @@ public class SettingsImport {
* @param settings
* @return
*/
ArrayList<SettingsImportGroup> organiseSettingsGroups(ArrayList<PamControlledUnitSettings> settings) {
public ArrayList<SettingsImportGroup> organiseSettingsGroups(ArrayList<PamControlledUnitSettings> settings) {
/**
* this needs rewriting for psfx files which are organised differently. first we need to find
* a list of PAMGuard modules by finding the settings group of the PAMController.

View File

@ -195,12 +195,14 @@ public class SettingsImportDialog extends PamDialog {
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
SettingsImportGroup set = groupedSettings.get(rowIndex);
PamControlledUnitSettings mainSet = set.getMainSettings();
// PamControlledUnitSettings mainSet = set.getMainSettings();
switch (columnIndex) {
case 0:
return mainSet.getUnitType();
return set.getUsedModuleInfo().getUnitType();
// return mainSet.getUnitType();
case 1:
return mainSet.getUnitName();
return set.getUsedModuleInfo().unitName;
// return mainSet.getUnitName();
case 2:
// return choiceBoxes[rowIndex].getSelectedItem().toString();
return set.getImportChoice().toString();

View File

@ -82,8 +82,10 @@ public class SettingsImportGroup {
try {
ownerClass = Class.forName(usedModuleInfo.className);
} catch (ClassNotFoundException e) {
System.out.println("Unknown class in loaded settings: " + usedModuleInfo.className);
// TODO Auto-generated catch block
e.printStackTrace();
// e.printStackTrace();
}
ArrayList<PamControlledUnit> existingModules =
PamController.getInstance().findControlledUnits(ownerClass);

View File

@ -29,6 +29,7 @@ import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import com.sun.javafx.runtime.VersionInfo;
@ -42,12 +43,14 @@ import PamController.PamguardVersionInfo;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterData;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
import PamUtils.PamCalendar;
import PamUtils.XMLUtils;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import PamguardMVC.PamProcess;
import binaryFileStorage.BinaryStore;
import tethys.TethysControl;
/**
* Class for writing XML configuration output to a file.
@ -62,6 +65,8 @@ public class PamguardXMLWriter implements PamSettings {
private static final Set<Class<?>> WRAPPER_TYPES = getWrapperTypes();
private XMLWriterSettings writerSettings = new XMLWriterSettings();
private boolean excludeDisplaySettings;
// private String xmlNameSpace;
private static PamguardXMLWriter singleInstance;
@ -83,6 +88,19 @@ public class PamguardXMLWriter implements PamSettings {
}
return singleInstance;
}
/**
* Recursively walk the tree and add a namespace to every
* single element.
* @param doc
* @param nameSpace
* @return
*/
public boolean addNameSpaceToElements(Document doc, Element el, String nameSpace) {
// el.setAttributeNS(nameSpace, nameSpace, nameSpace);
NamedNodeMap attributes = el.getAttributes();
return true;
}
/**
* Make a document with the options specified in writerSettings.
@ -371,6 +389,32 @@ public class PamguardXMLWriter implements PamSettings {
* @return xml content as a a string.
*/
public String getAsString(Document doc) {
return getAsString(doc, true);
// try {
// DOMSource domSource = new DOMSource(doc);
// StringWriter writer = new StringWriter();
// StreamResult result = new StreamResult(writer);
// TransformerFactory tf = TransformerFactory.newInstance();
// Transformer transformer = tf.newTransformer();
// transformer.setOutputProperty(OutputKeys.METHOD, "xml");
// transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
//// transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
// transformer.setOutputProperty(OutputKeys.INDENT, "yes");
// transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
// transformer.transform(domSource, result);
// return writer.toString();
// } catch (TransformerException e) {
// e.printStackTrace();
// return null;
// }
}
/**
* Get the xml document as a String.
* @param doc xml document
* @param indent Indent / format the document.
* @return xml content as a a string.
*/
public String getAsString(Document doc, boolean indent) {
try {
DOMSource domSource = new DOMSource(doc);
StringWriter writer = new StringWriter();
@ -380,7 +424,7 @@ public class PamguardXMLWriter implements PamSettings {
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
// transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, indent ? "yes" : "no");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.transform(domSource, result);
return writer.toString();
@ -411,8 +455,7 @@ public class PamguardXMLWriter implements PamSettings {
* @param pamSettingsUnit
* @return xml element
*/
private Element writeUnitSettings(Document doc, Element parent, PamSettings pamSettingsUnit) {
public Element writeUnitSettings(Document doc, Element parent, PamSettings pamSettingsUnit) {
int[] settingInds = findSettings(null, pamSettingsUnit.getUnitName());
PamSettings[] settingsObjects = null;
if (settingInds != null) {
@ -436,7 +479,7 @@ public class PamguardXMLWriter implements PamSettings {
* can be temporary settings objects when writing temporary settings from dialogs.
* @return new XML element.
*/
private Element writeUnitSettings(Document doc, Element parent, PamSettings pamSettingsUnit, PamSettings[] toWrite) {
public Element writeUnitSettings(Document doc, Element parent, PamSettings pamSettingsUnit, PamSettings[] toWrite) {
Element moduleData = doc.createElement("MODULE");
moduleData.setAttribute("Java.class", pamSettingsUnit.getClass().getName());
moduleData.setAttribute("UnitType", pamSettingsUnit.getUnitType());
@ -457,6 +500,9 @@ public class PamguardXMLWriter implements PamSettings {
Element settingEl = doc.createElement("CONFIGURATION");
moduleData.appendChild(settingEl);
for (int i = 0; i < toWrite.length; i++) {
if (wantObject(toWrite[i]) == false) {
continue;
}
Element setEl = writeSettings(doc, toWrite[i], new ArrayList<Object>());
if (setEl != null) {
settingEl.appendChild(setEl);
@ -467,6 +513,32 @@ public class PamguardXMLWriter implements PamSettings {
return moduleData;
}
/**
* USed by the Tethys writer to avoid writing display settings.
* @param pamSettings
* @return
*/
private boolean wantObject(PamSettings pamSettings) {
if (excludeDisplaySettings == false) {
return true;
}
Object obj = pamSettings.getSettingsReference();
if (obj == null) {
return false;
}
if (obj instanceof ManagedParameters) {
ManagedParameters managedParams = (ManagedParameters) obj;
PamParameterSet paramSet = managedParams.getParameterSet();
if (paramSet == null) {
return false;
}
if (paramSet.getParameterSetType() == ParameterSetType.DISPLAY && excludeDisplaySettings) {
return false;
}
}
return true;
}
/**
* Write settings for a settings object, using the standard retreived object
* from the settings.
@ -478,6 +550,14 @@ public class PamguardXMLWriter implements PamSettings {
private Element writeSettings(Document doc, PamSettings pamSettings, ArrayList<Object> objectHierarchy) {
return writeSettings(doc, pamSettings, pamSettings.getSettingsReference(), objectHierarchy);
}
public Document writeOneObject(Object data) {
Document doc = XMLUtils.createBlankDoc();
Element el = doc.createElement("Settings");
Element newel = writeObjectData(doc, el, data, new ArrayList<Object>());
doc.appendChild(newel);
return doc;
}
/**
* Write settings using an object of choice instead of the standard one from PamSettings.
@ -489,6 +569,7 @@ public class PamguardXMLWriter implements PamSettings {
* @return
*/
private Element writeSettings(Document doc, PamSettings pamSettings, Object data, ArrayList<Object> objectHierarchy) {
Element el = doc.createElement("SETTINGS");
el.setAttribute("Type", pamSettings.getUnitType());
el.setAttribute("Name", pamSettings.getUnitName());
@ -500,10 +581,13 @@ public class PamguardXMLWriter implements PamSettings {
return el;
}
private Element writeObjectData(Document doc, Element el, Object data, ArrayList<Object> objectHierarchy) {
public Element writeObjectData(Document doc, Element el, Object data, ArrayList<Object> objectHierarchy) {
if (data == null) {
return null;
}
if (objectHierarchy == null) {
objectHierarchy = new ArrayList<>();
}
if (objectHierarchy.contains(data)) {
// just write the reference, but nothing else or we'll end up in an infinite loop of objects.
Element e = doc.createElement("Object");
@ -525,8 +609,10 @@ public class PamguardXMLWriter implements PamSettings {
if (parameterSet == null) {
return null;
}
objectHierarchy.add(data);
if (objectHierarchy != null) {
objectHierarchy.add(data);
}
for (PamParameterData pamParam:parameterSet.getParameterCollection()) {
try {
Object paramData = pamParam.getData();
@ -765,9 +851,10 @@ public class PamguardXMLWriter implements PamSettings {
processData.setAttribute("Name", process.getProcessName());
PamDataBlock source = process.getParentDataBlock();
if (source != null) {
Element inputEl = doc.createElement("Input");
inputEl.setAttribute("Name", source.getLongDataName());
inputEl.setAttribute("Channels", String.format("0x%X", source.getChannelMap()));
Element inputEl = source.getDataBlockXML(doc);
// Element inputEl = doc.createElement("Input");
// inputEl.setAttribute("Name", source.getLongDataName());
// inputEl.setAttribute("Channels", String.format("0x%X", source.getChannelMap()));
processData.appendChild(inputEl);
}
int nOut = process.getNumOutputDataBlocks();
@ -798,7 +885,16 @@ public class PamguardXMLWriter implements PamSettings {
*/
private int[] findSettings(String type, String name) {
if (settingsSets == null) {
return null;
makeSettingsList();
if (settingsSets == null) {
return null;
}
}
if (usedSettingsSets == null) {
usedSettingsSets = new boolean[settingsSets.size()];
}
else if (usedSettingsSets.length < settingsSets.size()) {
usedSettingsSets = Arrays.copyOf(usedSettingsSets, settingsSets.size());
}
int[] found = new int[settingsSets.size()];
int nFound = 0;
@ -818,7 +914,7 @@ public class PamguardXMLWriter implements PamSettings {
return Arrays.copyOf(found, nFound);
}
private ArrayList<PamSettings> makeSettingsList() {
public ArrayList<PamSettings> makeSettingsList() {
PamSettingManager settingsManager = PamSettingManager.getInstance();
settingsSets = settingsManager.getOwners();
if (settingsSets == null) {
@ -850,6 +946,14 @@ public class PamguardXMLWriter implements PamSettings {
return doc;
}
/**
* Is this element a writable type ? Basically, this means
* that it's a primitive of some sort. Otherwise it's
* probably an object and may even be a list in which case
* it will need treating differently.
* @param clazz
* @return
*/
public static boolean isWritableType(Class<?> clazz)
{
if (clazz.isEnum()) return true;
@ -940,5 +1044,23 @@ public class PamguardXMLWriter implements PamSettings {
return true;
}
/**
* @return the excludeDisplaySettings
*/
public boolean isExcludeDisplaySettings() {
return excludeDisplaySettings;
}
/**
* @param excludeDisplaySettings the excludeDisplaySettings to set
*/
public void setExcludeDisplaySettings(boolean excludeDisplaySettings) {
this.excludeDisplaySettings = excludeDisplaySettings;
}
// public void setStaticNameSpace(String xmlNameSpace) {
// this.xmlNameSpace = xmlNameSpace;
// }
}

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
public class XMLWriterSettings implements Serializable, Cloneable, ManagedParameters {
@ -34,7 +35,7 @@ public class XMLWriterSettings implements Serializable, Cloneable, ManagedParame
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DISPLAY);
return ps;
}

View File

@ -5,6 +5,7 @@ import java.io.Serializable;
import PamController.soundMedium.GlobalMedium.SoundMedium;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
/**
* Stores parameters for the current medium.
@ -41,7 +42,7 @@ public class GlobalMediumParams implements Serializable, Cloneable, ManagedParam
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DISPLAY);
return ps;
}

View File

@ -23,6 +23,7 @@ package PamModel;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
@ -44,11 +45,15 @@ import whistlesAndMoans.AbstractWhistleDataUnit;
import fftManager.FFTDataUnit;
import fftManager.PamFFTControl;
import group3dlocaliser.Group3DLocaliserControl;
import metadata.MetaDataContol;
import meygenturbine.MeygenTurbine;
import printscreen.PrintScreenControl;
import rockBlock.RockBlockControl;
import tethys.TethysControl;
import turbineops.TurbineOperationControl;
import GPS.GpsDataUnit;
import Map.MapController;
import Map.gridbaselayer.GridbaseControl;
import NMEA.NMEADataUnit;
import PamController.PamControlledUnitSettings;
import PamController.PamController;
@ -62,6 +67,7 @@ import PamguardMVC.PamDataBlock;
import analogarraysensor.ArraySensorControl;
import backupmanager.BackupManager;
import beamformer.continuous.BeamFormerControl;
import beamformer.localiser.BeamFormLocaliserControl;
import bearinglocaliser.BearingLocaliserControl;
import binaryFileStorage.SecondaryBinaryStore;
import cepstrum.CepstrumControl;
@ -454,6 +460,20 @@ final public class PamModel implements PamSettings {
mi.setToolTipText("Manage automated data backups");
mi.setModulesMenuGroup(utilitiesGroup);
mi.setMaxNumber(1);
// mi = PamModuleInfo.registerControlledUnit(MetaDataContol.class.getName(), MetaDataContol.unitType);
// mi.setToolTipText("Project Meta Data");
// mi.setModulesMenuGroup(utilitiesGroup);
// mi.setMaxNumber(1);
if (isViewer) {
mi = PamModuleInfo.registerControlledUnit(TethysControl.class.getName(), TethysControl.defaultName);
mi.setToolTipText("Interface to Tethys Database");
mi.setModulesMenuGroup(utilitiesGroup);
mi.setMaxNumber(1);
mi.setHidden(SMRUEnable.isEnable() == false);
}
/*
* ************* End Utilities Group *******************
@ -928,14 +948,17 @@ final public class PamModel implements PamSettings {
}
/* (non-Javadoc)
* @see PamModel.PamModelInterface#startModel()
/**
* Add any remaining REQUIRED modules.<br>
* this get's called after the PamController has loaded it's main settings.
* So at this point, go through all the PamModuleInfo's and check that
* all have at least the minimum number required
* @return true
*/
public synchronized boolean startModel() {
/*
* this get's called after the PamController has loaded it's main settings.
* So at this point, go through all the PamModuleInfo's and check that
* all have at least the minimum number required
*/
PamSettingManager.getInstance().registerSettings(this);
@ -952,11 +975,11 @@ final public class PamModel implements PamSettings {
// writeModuleList();
return false;
return true;
}
/**
* Really just debu goutput to make a list of all modules ...
* Really just debug output to make a list of all modules ...
*/
private void writeModuleList() {
ArrayList<PamModuleInfo> moduleInfoList = PamModuleInfo.getModuleList();
@ -1063,7 +1086,7 @@ final public class PamModel implements PamSettings {
// clear the current list
pluginList.clear();
daqList.clear();
/*
* If developing a new PAMPlugin in eclipse, the easiest way to do it is to make a new
* Eclipse project for your plugin code. Within that project, copy this PamModel class
@ -1078,6 +1101,8 @@ final public class PamModel implements PamSettings {
* When you export the code for your plugin to a jar file, remember to NOT inlcude the copy of
* PamModel !
*/
// pluginList.add(new MorlaisWP1aPlugin());
// Load up whatever default classloader was used to create this class. Must use the same classloader
// for all plugins, or else we will not be able to create proper dependencies between them or be able
@ -1145,11 +1170,30 @@ final public class PamModel implements PamSettings {
// to add that URL to the default classloader path.
URL newURL = jarList.get(i).toURI().toURL();
// original method
// Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
// method.setAccessible(true);
// method.invoke(cl, newURL);
// first fix attempt - create a brand new URLClassLoader. As expected, we get a ClassCastException when trying
// to load the parameters so we can't save params using this method
// URL[] newURLArray = new URL[1];
// newURLArray[0] = newURL;
// cl = new URLClassLoader(newURLArray);
// second attempt - custom class loader with the system app loader specified as the parent. Loads controlled unit, but
// as before it doesn't load the parameters
classLoader.addURL(newURL);
// third attempt
// Class<?> genericClass = cl.getClass();
// Method method = genericClass.getSuperclass().getDeclaredMethod("addURL", new Class[] {URL.class});
// method.setAccessible(true);
// method.invoke(cl, new Object[] {newURL});
// Save the name of the class to the global pluginBeingLoaded variable, and load the class.
this.setPluginBeingLoaded(className);
// Class c = cl.loadClass(className);
@ -1171,13 +1215,15 @@ final public class PamModel implements PamSettings {
if (intf[j].getName().equals("PamModel.PamPluginInterface")) {
// create an instance of the interface class.
PamPluginInterface pf = (PamPluginInterface) c.newInstance();
Constructor constructor = c.getDeclaredConstructor(null);
PamPluginInterface pf = (PamPluginInterface) constructor.newInstance(null);
if (getPluginBeingLoaded()==null) {
continue;
}
// Let the user know which valid plugins have been found
System.out.println(" Creating instance of " + pf.getDefaultName() + ": " + pf.getClassName());
System.out.printf(" Loading plugin interface for %s : %s version %s\n",
pf.getDefaultName(), pf.getClassName(), pf.getVersion());
if (getPluginBeingLoaded()==null) {
continue;
}
@ -1193,7 +1239,7 @@ final public class PamModel implements PamSettings {
pluginList.add(pf); // add it to the list
} else {
System.out.println(" Error: "+pf.getDefaultName()+" cannot run in this mode. Skipping module.");
System.out.println(" Error: " + pf.getDefaultName()+" cannot run in this mode. Skipping module.");
}
if (getPluginBeingLoaded()==null) {
continue;
@ -1202,12 +1248,16 @@ final public class PamModel implements PamSettings {
// now check for interfaces that implement DaqSystemInterface
if (intf[j].getName().equals("Acquisition.DaqSystemInterface")) {
DaqSystemInterface pf = (DaqSystemInterface) c.newInstance(); // create an instance of the interface class
Constructor constructor = c.getDeclaredConstructor(null);
DaqSystemInterface pf = (DaqSystemInterface) constructor.newInstance(null);
// DaqSystemInterface pf = (DaqSystemInterface) c.newInstance(); // create an instance of the interface class
if (getPluginBeingLoaded()==null) {
continue;
}
System.out.println(" Creating instance of " + pf.getDefaultName() + ": " + className);
System.out.printf(" Loading daq plugin interface for %s version %s\n",
pf.getDefaultName(), pf.getVersion());
// System.out.println(" Creating instance of " + pf.getDefaultName() + ": " + className);
if (getPluginBeingLoaded()==null) {
continue;
}
@ -1230,8 +1280,9 @@ final public class PamModel implements PamSettings {
"for help.<p>" +
"This plug-in will not be available for loading";
String help = null;
int ans = WarnOnce.showWarning(PamController.getInstance().getGuiFrameManager().getFrame(0), title, msg, WarnOnce.WARNING_MESSAGE, help, e1);
int ans = WarnOnce.showWarning(PamController.getMainFrame(), title, msg, WarnOnce.WARNING_MESSAGE, help, e1);
System.err.println("Exception while loading " + className);
System.err.println(e1.getMessage());
continue;
}
}
@ -1244,7 +1295,7 @@ final public class PamModel implements PamSettings {
"for help.<p>" +
"This plug-in will not be available for loading";
String help = null;
int ans = WarnOnce.showWarning(PamController.getInstance().getGuiFrameManager().getFrame(0), title, msg, WarnOnce.WARNING_MESSAGE, help, ex);
int ans = WarnOnce.showWarning(PamController.getMainFrame(), title, msg, WarnOnce.WARNING_MESSAGE, help, ex);
System.err.println("Exception while loading " + jarList.get(i).getName());
continue;
}
@ -1269,7 +1320,7 @@ final public class PamModel implements PamSettings {
// instantiate the plugin control class using the custom class loader
try {
// File classFile = new File(pf.getJarFile());
File classFile = new File(pf.getJarFile());
//URLClassLoader cl = new URLClassLoader(new URL[]{classFile.toURI().toURL()});
// mi = PamModuleInfo.registerControlledUnit(pf.getClassName(), pf.getDescription(),cl);
mi = PamModuleInfo.registerControlledUnit(pf.getClassName(), pf.getDescription(),classLoader);
@ -1335,7 +1386,7 @@ final public class PamModel implements PamSettings {
"for help.<p>" +
"This plug-in will not be available for loading";
String help = null;
int ans = WarnOnce.showWarning(PamController.getInstance().getGuiFrameManager().getFrame(0), title, msg, WarnOnce.WARNING_MESSAGE, help, e1);
int ans = WarnOnce.showWarning(PamController.getMainFrame(), title, msg, WarnOnce.WARNING_MESSAGE, help, e1);
System.err.println("Exception while loading " + pf.getDefaultName());
pluginList.remove(pf);
continue;

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
import PamModel.parametermanager.ManagedParameters;
import PamModel.parametermanager.PamParameterSet;
import PamModel.parametermanager.PamParameterSet.ParameterSetType;
public class PamModelSettings implements Cloneable, Serializable, ManagedParameters {
@ -74,7 +75,7 @@ public class PamModelSettings implements Cloneable, Serializable, ManagedParamet
@Override
public PamParameterSet getParameterSet() {
PamParameterSet ps = PamParameterSet.autoGenerate(this);
PamParameterSet ps = PamParameterSet.autoGenerate(this, ParameterSetType.DETECTOR);
return ps;
}

View File

@ -34,6 +34,11 @@ abstract public class PamParameterData {
*/
private String postTitle;
/**
* field length for automatic dialogs.
*/
private int fieldLength;
/**
* @param parentObject
@ -45,6 +50,21 @@ abstract public class PamParameterData {
this.field = field;
}
/**
* @param parentObject
* @param field
* @param shortName
* @param toolTip
* @param fieldLength length of text in automatic dialogs.
*/
public PamParameterData(Object parentObject, Field field, String shortName, String toolTip, int fieldLength) {
super();
this.field = field;
this.shortName = shortName;
this.toolTip = toolTip;
this.fieldLength = fieldLength;
}
/**
* @param parentObject
* @param field
@ -58,7 +78,6 @@ abstract public class PamParameterData {
this.toolTip = toolTip;
}
/**
* @param shortName the shortName to set
*/
@ -66,6 +85,20 @@ abstract public class PamParameterData {
this.shortName = shortName;
}
/**
* Set info about a parameter
* @param shortName short name, e.g. to use in a dialog
* @param postTitle post title, e.g. text coming after a data entry field in a dialog
* @param toolTip tool tip to display over the component in a dialog.
* @param fieldLength length of text in automatic dialogs.
*/
public void setInfo(String shortName, String postTitle, String toolTip, int fieldLength) {
this.shortName = shortName;
this.postTitle = postTitle;
this.toolTip = toolTip;
this.fieldLength = fieldLength;
}
/**
* Set info about a parameter
* @param shortName short name, e.g. to use in a dialog
@ -136,6 +169,9 @@ abstract public class PamParameterData {
* @return a short name for the field, suitable for use in dialogs.
*/
public String getShortName() {
if (shortName == null) {
return getFieldName();
}
return shortName;
}
@ -166,5 +202,19 @@ abstract public class PamParameterData {
return String.format("Param %s class %s", getFieldName(), getDataClass());
}
/**
* @return the fieldLength
*/
public int getFieldLength() {
return fieldLength;
}
/**
* @param fieldLength the fieldLength to set
*/
public void setFieldLength(int fieldLength) {
this.fieldLength = fieldLength;
}
}

View File

@ -59,9 +59,12 @@ public class PamParameterDataGetter extends PrivatePamParameterData {
if (setter == null) {
return false;
}
// need to convert the type
Object convObj = convertStringType(data);
try {
setter.invoke(getParentObject(), data);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
Object parentObj = getParentObject();
setter.invoke(parentObj, convObj);
} catch (InvocationTargetException e) {
e.printStackTrace();
return false;
}

View File

@ -10,7 +10,6 @@ import java.util.Collection;
import java.util.Hashtable;
import java.util.List;
import binaryFileStorage.BinaryStoreSettings;
/**
* Description of the parameters within a class. Primarily holds a list
@ -29,6 +28,9 @@ public class PamParameterSet {
private static boolean printDebug = false;
public enum ParameterSetType {DETECTOR, DISPLAY};
private ParameterSetType parameterSetType;
/**
* Standard modifiers to exclude. This is important for many classes which will tend to
* do crazy things such as incorporate ALL of their final fields, e.g. when a Color
@ -55,8 +57,21 @@ public class PamParameterSet {
* in the STANDARD_MODIFIER_EXCLUSIONS list (FINAL or STATIC).
* @return Created parameter set.
*/
@Deprecated
public static PamParameterSet autoGenerate(Object parentObject) {
return autoGenerate(parentObject, STANDARD_MODIFIER_EXCLUSIONS);
return autoGenerate(parentObject, ParameterSetType.DETECTOR);
}
/**
* Automatically generate a parameter set for a class. Will include all public fields and
* any private or protected fields for which a getter can be found that has a similar enough name
* @param parentObject class to generate description for. Exception is anything that's listed
* in the STANDARD_MODIFIER_EXCLUSIONS list (FINAL or STATIC).
* @return Created parameter set.
*/
public static PamParameterSet autoGenerate(Object parentObject, ParameterSetType parameterSetType) {
PamParameterSet paramSet = autoGenerate(parentObject, STANDARD_MODIFIER_EXCLUSIONS);
paramSet.setParameterSetType(parameterSetType);
return paramSet;
}
/**
@ -286,4 +301,19 @@ public class PamParameterSet {
public PamParameterData removeParameterData(String paramName) {
return parameterDatas.remove(paramName);
}
/**
* @return the parameterSetType
*/
public ParameterSetType getParameterSetType() {
return parameterSetType;
}
/**
* @param parameterSetType the parameterSetType to set
*/
public void setParameterSetType(ParameterSetType parameterSetType) {
this.parameterSetType = parameterSetType;
}
}

View File

@ -0,0 +1,73 @@
package PamModel.parametermanager;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenuItem;
import PamModel.parametermanager.swing.ManagedParameterDialog;
import generalDatabase.parameterstore.ParameterDatabaseStore;
/**
* Just about everything giving overall control of some managed parameters.
* May be a bit too specific on first cut and need to be abstracted.
* Testing on 'Deployment' data.
* @author dg50
*
* @param <T>
*/
public class ParameterSetManager<T extends ManagedParameters> {
private T managedParams;
private String name;
public ParameterSetManager(T defaultParams, String name) {
setManagedParams(defaultParams);
this.name = name;
// if (managedParams == null) {
// managedParams = new T();
// }
}
/**
* @return the managedParams
*/
public T getManagedParams() {
return managedParams;
}
/**
* @param managedParams the managedParams to set
*/
public void setManagedParams(T managedParams) {
this.managedParams = managedParams;
}
public JMenuItem getMenuItem(Window parent) {
if (managedParams == null) {
return null;
}
JMenuItem menuItem = new JMenuItem(name + " ...");
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showDialog(parent);
}
});
return menuItem;
}
protected void showDialog(Window parent) {
ManagedParameterDialog<T> dialog = new ManagedParameterDialog<T>(parent, name, managedParams);
T newParams = dialog.showDialog(parent, name, managedParams);
if (newParams != null) {
ParameterDatabaseStore paramDatabase = new ParameterDatabaseStore("MetaData");
paramDatabase.saveParameterSet(newParams);
}
}
}

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