Version 6.2.5

This commit is contained in:
Chrystian Huot 2022-04-06 07:40:21 -04:00
parent 228437cb96
commit 0fbe97469b
15 changed files with 656 additions and 585 deletions

View file

@ -31,6 +31,10 @@ _v6.2.4_
- Avoid using setInterval and setTimeout in the webapp.
- Fix talkgroup search filter upon new configuration (issue #158).
_v6.2.5_
- Fix unnecessary auto populate of unit id/label (issue #160).
## Version 6.1
- Calls now support patched talkgroups.
@ -452,7 +456,7 @@ _v4.7.6_
## Version 4.1
- New offline playback mode.
- New playback mode.
## Version 4.0

View file

@ -26,13 +26,13 @@ Clone the official repository on your computer and start the build process.
When finished, you will find the precompiled versions for various platforms in the `dist` folder.
rdio-scanner-darwin-amd64-v6.2.4.zip
rdio-scanner-darwin-arm64-v6.2.4.zip
rdio-scanner-freebsd-amd64-v6.2.4.zip
rdio-scanner-linux-386-v6.2.4.zip
rdio-scanner-linux-amd64-v6.2.4.zip
rdio-scanner-linux-arm64-v6.2.4.zip
rdio-scanner-linux-arm-v6.2.4.zip
rdio-scanner-windows-amd64-v6.2.4.zip
rdio-scanner-darwin-amd64-v6.2.5.zip
rdio-scanner-darwin-arm64-v6.2.5.zip
rdio-scanner-freebsd-amd64-v6.2.5.zip
rdio-scanner-linux-386-v6.2.5.zip
rdio-scanner-linux-amd64-v6.2.5.zip
rdio-scanner-linux-arm64-v6.2.5.zip
rdio-scanner-linux-arm-v6.2.5.zip
rdio-scanner-windows-amd64-v6.2.5.zip
**Happy Rdio scanning !**

View file

@ -16,8 +16,8 @@
################################################################################
app := rdio-scanner
date := 2022/04/04
ver := 6.2.4
date := 2022/04/06
ver := 6.2.5
client := $(wildcard client/*.json client/*.ts)
server := $(wildcard server/*.go)

932
client/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,30 +1,30 @@
{
"author": "Chrystian Huot <chrystian.huot@saubeo.solutions>",
"dependencies": {
"@angular/animations": "^13.3.0",
"@angular/cdk": "^13.3.1",
"@angular/common": "~13.3.0",
"@angular/compiler": "~13.3.0",
"@angular/core": "~13.3.0",
"@angular/forms": "~13.3.0",
"@angular/material": "^13.3.1",
"@angular/platform-browser": "~13.3.0",
"@angular/platform-browser-dynamic": "~13.3.0",
"@angular/router": "^13.3.0",
"@angular/service-worker": "^13.3.0",
"@angular/animations": "^13.3.1",
"@angular/cdk": "^13.3.2",
"@angular/common": "~13.3.1",
"@angular/compiler": "~13.3.1",
"@angular/core": "~13.3.1",
"@angular/forms": "~13.3.1",
"@angular/material": "^13.3.2",
"@angular/platform-browser": "~13.3.1",
"@angular/platform-browser-dynamic": "~13.3.1",
"@angular/router": "^13.3.1",
"@angular/service-worker": "^13.3.1",
"rxjs": "~7.4.0",
"tslib": "^2.3.1",
"zone.js": "~0.11.5"
},
"devDependencies": {
"@angular-devkit/build-angular": "^13.3.0",
"@angular/cli": "^13.3.0",
"@angular/compiler-cli": "~13.3.0",
"@angular-devkit/build-angular": "^13.3.1",
"@angular/cli": "^13.3.1",
"@angular/compiler-cli": "~13.3.1",
"@types/node": "^17.0.23",
"@typescript-eslint/eslint-plugin": "^5.16.0",
"@typescript-eslint/parser": "^5.16.0",
"@typescript-eslint/eslint-plugin": "^5.18.0",
"@typescript-eslint/parser": "^5.18.0",
"ajv-keywords": "^5.1.0",
"eslint": "^8.11.0",
"eslint": "^8.12.0",
"ts-node": "~10.7.0",
"typescript": "~4.4.4"
},
@ -38,5 +38,5 @@
"build": "ng build --base-href ./ --configuration production",
"start": "ng serve"
},
"version": "6.2.4"
"version": "6.2.5"
}

View file

@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
rdio@macos ~ % mkdir rdio-scanner
rdio@macos ~ % cd rdio-scanner
rdio@macos rdio-scanner % unzip \
> ~/Downloads/rdio-scanner-darwin-arm64-v6.2.4.zip
Archive: /Users/rdio/Downloads/rdio-scanner-darwin-arm64-v6.2.4.zip
> ~/Downloads/rdio-scanner-darwin-arm64-v6.2.5.zip
Archive: /Users/rdio/Downloads/rdio-scanner-darwin-arm64-v6.2.5.zip
inflating: rdio-scanner
inflating: rdio-scanner.pdf
@ -51,11 +51,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
rdio@macos rdio-scanner % ./rdio-scanner
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 08:38:06 server started
2022/04/04 08:38:06 main interface at http://macos.local:3000
2022/04/04 08:38:06 admin interface at http://macos.local:3000/admin
2022/04/06 08:38:06 server started
2022/04/06 08:38:06 main interface at http://macos.local:3000
2022/04/06 08:38:06 admin interface at http://macos.local:3000/admin
4. Access the administrative dashboard to finalize the configuration.
@ -77,11 +77,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance
rdio@macos rdio-scanner % ./rdio-scanner --listen :80
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 08:48:03 server started
2022/04/04 08:48:03 main interface at http://macos.local
2022/04/04 08:48:03 admin interface at http://macos.local/admin
2022/04/06 08:48:03 server started
2022/04/06 08:48:03 main interface at http://macos.local
2022/04/06 08:48:03 admin interface at http://macos.local/admin
## Listening on a SSL port
@ -95,12 +95,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer
> -ssl_key_file mykey.key \
> -ssl_listen :443
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 08:50:58 server started
2022/04/04 08:50:58 main interface at http://macos.local
2022/04/04 08:50:58 main interface at https://macos.local
2022/04/04 08:50:58 admin interface at https://macos.local/admin
2022/04/06 08:50:58 server started
2022/04/06 08:50:58 main interface at http://macos.local
2022/04/06 08:50:58 main interface at https://macos.local
2022/04/06 08:50:58 admin interface at https://macos.local/admin
If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal.
@ -118,7 +118,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y
> -ssl_auto_cert mydomain.com \
> -ssl_listen :443 \
> -config_save
2022/04/04 08:52:24 rdio-scanner.ini file created
2022/04/06 08:52:24 rdio-scanner.ini file created
All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list.
@ -132,12 +132,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an
rdio@macos rdio-scanner % ./rdio-scanner
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 08:54:08 server started
2022/04/04 08:54:08 main interface at http://macos.local
2022/04/04 08:54:08 main interface at https://macos.local
2022/04/04 08:54:08 admin interface at https://macos.local/admin
2022/04/06 08:54:08 server started
2022/04/06 08:54:08 main interface at http://macos.local
2022/04/06 08:54:08 main interface at https://macos.local
2022/04/06 08:54:08 admin interface at https://macos.local/admin
## Install Rdio Scanner as a service

View file

@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
rdio@pc-freebsd:~ $ mkdir rdio-scanner
rdio@pc-freebsd:~ $ cd rdio-scanner
rdio@pc-freebsd:~/rdio-scanner $ unzip \
> ~/rdio-scanner-freebsd-amd64-v6.2.4.zip
Archive: ../rdio-scanner-freebsd-amd64-v6.2.4.zip
> ~/rdio-scanner-freebsd-amd64-v6.2.5.zip
Archive: ../rdio-scanner-freebsd-amd64-v6.2.5.zip
extracting: rdio-scanner
extracting: rdio-scanner.pdf
@ -51,11 +51,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
rdio@pc-freebsd:~/rdio-scanner $ ./rdio-scanner
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 08:16:36 server started
2022/04/04 08:16:36 main interface at http://pc-freebsd:3000
2022/04/04 08:16:36 admin interface at http://pc-freebsd:3000/admin
2022/04/06 08:16:36 server started
2022/04/06 08:16:36 main interface at http://pc-freebsd:3000
2022/04/06 08:16:36 admin interface at http://pc-freebsd:3000/admin
4. Access the administrative dashboard to finalize the configuration.
@ -81,11 +81,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance
Password:
root@pc-freebsd:/home/rdio/rdio-scanner # ./rdio-scanner -listen :80
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 08:19:38 server started
2022/04/04 08:19:38 main interface at http://pc-freebsd
2022/04/04 08:19:38 admin interface at http://pc-freebsd/admin
2022/04/06 08:19:38 server started
2022/04/06 08:19:38 main interface at http://pc-freebsd
2022/04/06 08:19:38 admin interface at http://pc-freebsd/admin
## Listening on a SSL port
@ -101,12 +101,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer
> -ssl_key_file mykey.key \
> -ssl_listen :443
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 10:34:29 server started
2022/04/04 10:34:29 main interface at http://pc-freebsd
2022/04/04 10:34:29 main interface at https://pc-freebsd
2022/04/04 10:34:29 admin interface at https://pc-freebsd/admin
2022/04/06 10:34:29 server started
2022/04/06 10:34:29 main interface at http://pc-freebsd
2022/04/06 10:34:29 main interface at https://pc-freebsd
2022/04/06 10:34:29 admin interface at https://pc-freebsd/admin
If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal.
@ -126,7 +126,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y
> -ssl_auto_cert mydomain.com \
> -ssl_listen :443 \
> -config_save
2022/04/04 10:37:00 rdio-scanner.ini file created
2022/04/06 10:37:00 rdio-scanner.ini file created
All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list.
@ -142,12 +142,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an
Password:
root@pc-freebsd:/home/rdio/rdio-scanner # ./rdio-scanner
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 10:38:28 server started
2022/04/04 10:38:29 main interface at http://pc-freebsd
2022/04/04 10:38:29 main interface at https://pc-freebsd
2022/04/04 10:38:29 admin interface at https://pc-freebsd/admin
2022/04/06 10:38:28 server started
2022/04/06 10:38:29 main interface at http://pc-freebsd
2022/04/06 10:38:29 main interface at https://pc-freebsd
2022/04/06 10:38:29 admin interface at https://pc-freebsd/admin
## Install Rdio Scanner as a service

View file

@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
[rdio@pc-linux ~]$ mkdir rdio-scanner
[rdio@pc-linux ~]$ cd rdio-scanner
[rdio@pc-linux rdio-scanner]$ unzip \
> ~/Downloads/rdio-scanner-linux-amd64-v6.2.4.zip
Archive: /home/rdio/Downloads/rdio-scanner-linux-amd64-v6.2.4.zip
> ~/Downloads/rdio-scanner-linux-amd64-v6.2.5.zip
Archive: /home/rdio/Downloads/rdio-scanner-linux-amd64-v6.2.5.zip
inflating: rdio-scanner
inflating: rdio-scanner.pdf
@ -51,11 +51,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
[rdio@pc-linux rdio-scanner]$ ./rdio-scanner
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 09:11:48 server started
2022/04/04 09:11:48 main interface at http://pc-linux:3000
2022/04/04 09:11:48 admin interface at http://pc-linux:3000/admin
2022/04/06 09:11:48 server started
2022/04/06 09:11:48 main interface at http://pc-linux:3000
2022/04/06 09:11:48 admin interface at http://pc-linux:3000/admin
4. Access the administrative dashboard to finalize the configuration.
@ -78,11 +78,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance
[rdio@pc-linux rdio-scanner]$ sudo ./rdio-scanner -listen :80
[sudo] password for rdio:
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 09:14:00 server started
2022/04/04 09:14:00 main interface at http://pc-linux
2022/04/04 09:14:00 admin interface at http://pc-linux/admin
2022/04/06 09:14:00 server started
2022/04/06 09:14:00 main interface at http://pc-linux
2022/04/06 09:14:00 admin interface at http://pc-linux/admin
## Listening on a SSL port
@ -97,12 +97,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer
> -ssl_listen :443
[sudo] password for rdio:
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 09:16:47 server started
2022/04/04 09:16:47 main interface at http://pc-linux
2022/04/04 09:16:47 main interface at https://pc-linux
2022/04/04 09:16:47 admin interface at https://pc-linux/admin
2022/04/06 09:16:47 server started
2022/04/06 09:16:47 main interface at http://pc-linux
2022/04/06 09:16:47 main interface at https://pc-linux
2022/04/06 09:16:47 admin interface at https://pc-linux/admin
If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal.
@ -120,7 +120,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y
> -ssl_auto_cert mydomain.com \
> -ssl_listen :443 \
> -config_save
2022/04/04 09:19:29 rdio-scanner.ini file created
2022/04/06 09:19:29 rdio-scanner.ini file created
All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list.
@ -135,12 +135,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an
[rdio@pc-linux rdio-scanner]$ sudo ./rdio-scanner
[sudo] Mot de passe de rdio :
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 09:20:40 server started
2022/04/04 09:20:40 main interface at http://pc-linux
2022/04/04 09:20:40 main interface at https://pc-linux
2022/04/04 09:20:40 admin interface at https://pc-linux/admin
2022/04/06 09:20:40 server started
2022/04/06 09:20:40 main interface at http://pc-linux
2022/04/06 09:20:40 main interface at https://pc-linux
2022/04/06 09:20:40 admin interface at https://pc-linux/admin
## Install Rdio Scanner as a service

View file

@ -44,7 +44,7 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
C:\Users\rdio> cd rdio-scanner
C:\Users\rdio\rdio-scanner> tar -xvf ^
..\downloads\rdio-scanner-windows-amd64-v6.2.4.zip
..\downloads\rdio-scanner-windows-amd64-v6.2.5.zip
x rdio-scanner.exe
x rdio-scanner.pdf
@ -52,11 +52,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd
C:\Users\rdio\rdio-scanner>rdio-scanner
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 13:48:48 server started
2022/04/04 13:48:48 main interface at http://pc-windows:3000
2022/04/04 13:48:48 admin interface at http://pc-windows:3000/admin
2022/04/06 13:48:48 server started
2022/04/06 13:48:48 main interface at http://pc-windows:3000
2022/04/06 13:48:48 admin interface at http://pc-windows:3000/admin
4. Access the administrative dashboard to finalize the configuration.
@ -78,11 +78,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance
C:\Users\rdio\rdio-scanner>rdio-scanner -listen :80
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 10:53:31 server started
2022/04/04 10:53:31 main interface at http://pc-windows
2022/04/04 10:53:31 admin interface at http://pc-windows/admin
2022/04/06 10:53:31 server started
2022/04/06 10:53:31 main interface at http://pc-windows
2022/04/06 10:53:31 admin interface at http://pc-windows/admin
## Listening on a SSL port
@ -96,12 +96,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer
-ssl_key_file meykey.key ^
-ssl_listen :443
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 11:05:43 server started
2022/04/04 11:05:43 main interface at http://pc-windows
2022/04/04 11:05:43 main interface at https://pc-windows
2022/04/04 11:05:43 admin interface at https://pc-windows/admin
2022/04/06 11:05:43 server started
2022/04/06 11:05:43 main interface at http://pc-windows
2022/04/06 11:05:43 main interface at https://pc-windows
2022/04/06 11:05:43 admin interface at https://pc-windows/admin
If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal.
@ -119,7 +119,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y
-ssl_auto_cert mydomain.com ^
-ssl_listen :443 ^
-config_save
2022/04/04 11:08:28 rdio-scanner.ini file created
2022/04/06 11:08:28 rdio-scanner.ini file created
All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list.
@ -133,12 +133,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an
C:\Users\rdio\rdio-scanner>rdio-scanner
Rdio Scanner v6.2.4
Rdio Scanner v6.2.5
----------------------------------
2022/04/04 11:11:28 server started
2022/04/04 11:11:28 main interface at http://pc-windows
2022/04/04 11:11:28 main interface at https://pc-windows
2022/04/04 11:11:28 admin interface at https://pc-windows/admin
2022/04/06 11:11:28 server started
2022/04/06 11:11:28 main interface at http://pc-windows
2022/04/06 11:11:28 main interface at https://pc-windows
2022/04/06 11:11:28 admin interface at https://pc-windows/admin
\pagebreak{}

View file

@ -44,9 +44,9 @@ The color is _green_ by default, but can be customized by the system or by the t
![control Area](./images/webapp-controls.png?raw=true)\
| Button | Description |
| -------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![LIVE FEED](./images/webapp-control-livefeed-partial.png?raw=true) | When active, incoming audio will be played according to the active systems/talkgroups on the **SELECT TG** panel. The LED can also be _yellow_ if playing audio from the archive while **LIVE FEED** is inactive, this is called **offline playback mode**. Disabling **LIVE FEED** will also stop any playing audio and will clear the listening queue. |
| Button | Description |
| ------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![LIVE FEED](./images/webapp-control-livefeed-partial.png?raw=true) | When active, incoming audio will be played according to the active systems/talkgroups on the **SELECT TG** panel. The LED can also be _yellow_ if playing audio from the archive while **LIVE FEED** is inactive, this is called **playback mode**. Disabling **LIVE FEED** will also stop any playing audio and will clear the listening queue. |
| ![HOLD SYS](./images/webapp-control-holdsys.png?raw=true) | Temporarily maintain the current system in live feed mode. |
| ![HOLD TG](./images/webapp-control-holdtg.png?raw=true) | Temporarily maintain the current talkgroup in live feed mode. |
| ![REPLAY LAST](./images/webapp-control-replay.png?raw=true) | Replay the current audio from the beginning or the previous one if there is none active. |
@ -54,7 +54,7 @@ The color is _green_ by default, but can be customized by the system or by the t
| ![AVOID](./images/webapp-control-avoid.png?raw=true) | Activate and deactivate the talkgroup from the current or previous audio. |
| ![SEARCH CALL](./images/webapp-control-search.png?raw=true) | Display the archived audio panel. |
| ![PAUSE](./images/webapp-control-pause.png?raw=true) | Stop playing queue audio. Useful if you have to answer the phone without losing what's queued up for playing. |
| ![SELECT TG](./images/webapp-control-select.png?raw=true) | Display the systems/talkgroups selection panel where you decide which audio you want to listen to in _LIVE FEED_ mode, not in offline playback mode. |
| ![SELECT TG](./images/webapp-control-select.png?raw=true) | Display the systems/talkgroups selection panel where you decide which audio you want to listen to in _LIVE FEED_ mode, not in playback mode. |
## Select panel
@ -82,8 +82,8 @@ The first section concerns group selection. This section can be disabled from th
This is much like the group section, but for each system. There is also just two states for each button:
| Button | State |
| -------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| Button | State |
| ------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| ![ON](./images/webapp-select-system-on.png?raw=true) | The talkgroup from this system is active. If you press it while it is active, it will make the talkgroup inactive. |
| ![OFF](./images/webapp-select-system-off.png?raw=true) | The talkgroup from this system is inactive. If you press it while it is inactive, it will make the talkgroup active. |
| ![ALL OFF](./images/webapp-select-all-off.png?raw=true) | Make inactive every talkgroups from this system. |
@ -99,17 +99,17 @@ This is much like the group section, but for each system. There is also just two
This section presents the list of archived audio files stored in the database. Depending on the _LIVE FEED_ mode you are at, the replay function behaves differently:
| Mode | Function |
| ---------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Mode | Function |
| --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![LIVE FEED ON](./images/webapp-control-livefeed-on.png?raw=true) | while **LIVE FEED** is active, press the **PLAY** button to play this audio file. If another audio file is playing, it will be stopped and the one you just selected will be played instead. After playback finishes, the listening queue will resume as normal. |
| ![LIVE FEED PARTIAL](./images/webapp-control-livefeed-partial.png?raw=true) | This is the **offline playback mode** which can be activated only if **LIVE FEED** is inactive. Press the **PLAY** button to play this audio file. After playback is finishes, the next audio file from in list is played. While the audio is playing, pressing the **STOP** button will cancel the offline playback mode. |
| ![LIVE FEED PARTIAL](./images/webapp-control-livefeed-partial.png?raw=true) | This is the **playback mode** which can be activated only if **LIVE FEED** is inactive. Press the **PLAY** button to play this audio file. After playback is finishes, the next audio file from in list is played. While the audio is playing, pressing the **STOP** button will cancel the playback mode. |
\pagebreak{}
At the bottom left of this section is the toggle switch which allows you to toggle between play buttons and download buttons. The later ones allows you to download locally the audio file.
At the bottom right of this section is the _paginator_ to browse the whole database. This _paginator_ is disabled while in offline playback mode.
At the bottom right of this section is the _paginator_ to browse the whole database. This _paginator_ is disabled while in playback mode.
> Note that offline playback mode always requires your web app to be online. It is called like that because it plays archived audio files from the database.
> Note that playback mode always requires your web app to be online. It is called like that because it plays archived audio files from the database.
### Filters section
@ -119,6 +119,6 @@ This is the section where you filter the archived audio to a specific date, syst
There is also a small slider that changes the **PLAY** buttons to **DOWNLOAD** buttons. This allows you to download audio files individually regardless of the playback mode you use.
> Note that if you change any filter while in offline playback mode, it will deactivate it.
> Note that if you change any filter while in playback mode, it will deactivate it.
\pagebreak{}

View file

@ -313,9 +313,8 @@ func (controller *Controller) IngestCall(call *Call) {
switch v := call.units.(type) {
case *Units:
populated = true
if v != nil {
system.Units.Merge(v)
populated = system.Units.Merge(v)
}
}
}

View file

@ -10,9 +10,9 @@ require (
github.com/google/uuid v1.3.0
github.com/gorilla/websocket v1.5.0
github.com/kardianos/service v1.2.1
golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29
gopkg.in/ini.v1 v1.66.4
modernc.org/sqlite v1.15.4
modernc.org/sqlite v1.16.0
)
require (
@ -21,8 +21,8 @@ require (
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
github.com/stretchr/testify v1.7.0 // indirect
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect
golang.org/x/net v0.0.0-20220325170049-de3da57026de // indirect
golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f // indirect
golang.org/x/net v0.0.0-20220403103023-749bd193bc2b // indirect
golang.org/x/sys v0.0.0-20220405210540-1e041c57c461 // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/tools v0.1.10 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect

View file

@ -38,8 +38,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 h1:S25/rfnfsMVgORT4/J61MJ7rdyseOZOyvLIrZEZ7s6s=
golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o=
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o=
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
@ -49,8 +49,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220325170049-de3da57026de h1:pZB1TWnKi+o4bENlbzAgLrEbY4RMYmUIRobMcSmfeYc=
golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220403103023-749bd193bc2b h1:vI32FkLJNAWtGD4BwkThwEy6XS7ZLLMHkSkYfF8M0W0=
golang.org/x/net v0.0.0-20220403103023-749bd193bc2b/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -68,8 +68,8 @@ golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f h1:rlezHXNlxYWvBCzNses9Dlc7nGFaNMJeqLolcmQSSZY=
golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220405210540-1e041c57c461 h1:kHVeDEnfKn3T238CvrUcz6KeEsFHVaKh4kMTt6Wsysg=
golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@ -226,8 +226,8 @@ modernc.org/memory v1.0.7/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/sqlite v1.15.4 h1:pr3EA3Rety3j1c/9pCyGAe5d3vjF6wQwusHdgGCjIqc=
modernc.org/sqlite v1.15.4/go.mod h1:Jwe13ItpESZ+78K5WS6+AjXsUg+JvirsjN3iIDO4C8k=
modernc.org/sqlite v1.16.0 h1:DdvOGaWN0y+X7t2L7RUD63gcwbVjYZjcBZnA68g44EI=
modernc.org/sqlite v1.16.0/go.mod h1:Jwe13ItpESZ+78K5WS6+AjXsUg+JvirsjN3iIDO4C8k=
modernc.org/strutil v1.1.1 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs=
modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
modernc.org/tcl v1.11.2 h1:mXpsx3AZqJt83uDiFu9UYQVBjNjaWKGCF1YDSlpCL6Y=

View file

@ -60,21 +60,21 @@ func NewUnits() *Units {
}
}
func (units *Units) Add(id uint, label string) *Units {
found := false
func (units *Units) Add(id uint, label string) (*Units, bool) {
added := true
for _, u := range units.List {
if u.Id == id {
found = true
added = false
break
}
}
if !found {
if added {
units.List = append(units.List, &Unit{Id: id, Label: label})
}
return units
return units, added
}
func (units *Units) FromMap(f []interface{}) {
@ -93,13 +93,21 @@ func (units *Units) FromMap(f []interface{}) {
}
}
func (u *Units) Merge(units *Units) {
u.mutex.Lock()
defer u.mutex.Unlock()
func (u *Units) Merge(units *Units) bool {
merged := false
for _, v := range units.List {
u.Add(v.Id, v.Label)
if units != nil {
u.mutex.Lock()
defer u.mutex.Unlock()
for _, v := range units.List {
if _, added := u.Add(v.Id, v.Label); added {
merged = added
}
}
}
return merged
}
func (units *Units) Read(db *Database, systemId uint) error {

View file

@ -15,4 +15,4 @@
package main
const Version = "6.2.4"
const Version = "6.2.5"