diff --git a/.github/workflows/build_nsis_bundle.yml b/.github/workflows/build_nsis_bundle.yml
index 205ad5806..408a13a3b 100644
--- a/.github/workflows/build_nsis_bundle.yml
+++ b/.github/workflows/build_nsis_bundle.yml
@@ -98,4 +98,3 @@ jobs:
draft: true
files: ./FreeDATA-Installer.exe
tag_name: ${{ github.ref_name }}
- name: 'FreeDATA-${{ github.ref_name }}'
\ No newline at end of file
diff --git a/.github/workflows/modem_tests.yml b/.github/workflows/modem_tests.yml
index 23e9b2f01..01dc78dbd 100644
--- a/.github/workflows/modem_tests.yml
+++ b/.github/workflows/modem_tests.yml
@@ -21,7 +21,7 @@ jobs:
- python-version: "3.9"
- python-version: "3.10"
- python-version: "3.11"
- #- python-version: "3.12" NOT YET SUPPORTED BY NUITKA!
+ - python-version: "3.12"
steps:
- uses: actions/checkout@v4
diff --git a/.github/workflows/pip_package.yml b/.github/workflows/pip_package.yml
index 184b9197a..9f19bc181 100644
--- a/.github/workflows/pip_package.yml
+++ b/.github/workflows/pip_package.yml
@@ -39,6 +39,7 @@ jobs:
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@v1.10.1
+ if: startsWith(github.ref, 'refs/tags/v')
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}
diff --git a/freedata_gui/package.json b/freedata_gui/package.json
index 911231b75..58db4e385 100644
--- a/freedata_gui/package.json
+++ b/freedata_gui/package.json
@@ -1,6 +1,6 @@
{
"name": "FreeDATA",
- "version": "0.16.6-alpha",
+ "version": "0.16.7-alpha",
"description": "FreeDATA Client application for connecting to FreeDATA server",
"private": true,
"scripts": {
diff --git a/freedata_gui/src/App.vue b/freedata_gui/src/App.vue
index 1e17a4821..c39b85fec 100644
--- a/freedata_gui/src/App.vue
+++ b/freedata_gui/src/App.vue
@@ -1,13 +1,32 @@
-
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
+
diff --git a/freedata_gui/src/components/chat_conversations.vue b/freedata_gui/src/components/chat_conversations.vue
index 5bc95f3b8..83731eaa2 100644
--- a/freedata_gui/src/components/chat_conversations.vue
+++ b/freedata_gui/src/components/chat_conversations.vue
@@ -35,7 +35,7 @@
{{ details.unread_messages }} new
- {{ details.body ? details.body : '' }}
+ {{ sanitizeBody(details.body) || '' }}
{{ getDateTime(details.timestamp) }}
@@ -48,6 +48,7 @@
diff --git a/freedata_gui/src/components/grid/grid_stations_map.vue b/freedata_gui/src/components/grid/grid_stations_map.vue
index 043446c4c..4dd2a1d15 100644
--- a/freedata_gui/src/components/grid/grid_stations_map.vue
+++ b/freedata_gui/src/components/grid/grid_stations_map.vue
@@ -82,7 +82,9 @@ const drawMap = () => {
// Adjust pin size and line width with zoom
actualPinRadius = basePinRadius / event.transform.k;
- svg.selectAll('.pin').attr('r', actualPinRadius);
+ svg.selectAll('.my-pin').attr('r', actualPinRadius);
+ svg.selectAll('.heard-pin').attr('r', actualPinRadius);
+
svg.selectAll('.connection-line').attr('stroke-width', 1 / event.transform.k);
svg.selectAll('.country-path').attr('stroke-width', 0.5 / event.transform.k);
@@ -123,7 +125,7 @@ const drawMap = () => {
// Draw the pin for your station
g.append('circle')
- .attr('class', 'pin my-pin')
+ .attr('class', 'my-pin')
.attr('r', actualPinRadius + 2)
.attr('fill', 'blue')
.attr('cx', myX)
@@ -185,10 +187,12 @@ const drawMap = () => {
});
};
+// Function to update pins and draw lines
// Function to update pins and draw lines
const updatePinsAndLines = (g) => {
// Remove existing pins and lines
- g.selectAll('.pin').remove();
+ g.selectAll('.my-pin').remove();
+ g.selectAll('.heard-pin').remove();
g.selectAll('.connection-line').remove();
const heardStations = toRaw(state.heard_stations); // Ensure it's the raw data
@@ -210,7 +214,7 @@ const updatePinsAndLines = (g) => {
// Draw the pin for your station
g.append('circle')
- .attr('class', 'pin my-pin')
+ .attr('class', 'my-pin')
.attr('r', actualPinRadius + 2)
.attr('fill', 'blue')
.attr('cx', myX)
@@ -238,11 +242,11 @@ const updatePinsAndLines = (g) => {
}
// Add pins for heard stations
- g.selectAll('.pin')
+ g.selectAll('.heard-pin')
.data(points)
.enter()
.append('circle')
- .attr('class', 'pin')
+ .attr('class', 'heard-pin')
.attr('r', actualPinRadius)
.attr('fill', 'red')
.attr('cx', d => projection([d.lon, d.lat])[0])
@@ -255,16 +259,6 @@ const updatePinsAndLines = (g) => {
});
};
-// Zoom in function
-const zoomIn = () => {
- svg.transition().call(zoom.scaleBy, 1.2);
-};
-
-// Zoom out function
-const zoomOut = () => {
- svg.transition().call(zoom.scaleBy, 0.8);
-};
-
// Center the map
const centerMap = () => {
let mygrid = settings.remote.STATION.mygrid;
@@ -288,6 +282,15 @@ const centerMap = () => {
);
};
+// Zoom in function
+const zoomIn = () => {
+ svg.transition().call(zoom.scaleBy, 1.2);
+};
+
+// Zoom out function
+const zoomOut = () => {
+ svg.transition().call(zoom.scaleBy, 0.8);
+};
// Lifecycle hooks
onMounted(async () => {
@@ -308,7 +311,13 @@ onBeforeUnmount(() => {
height: 400px;
}
-.pin {
+.my-pin {
+ fill: blue;
+ stroke: black;
+ stroke-width: 1px;
+}
+
+.heard-pin {
fill: red;
stroke: black;
stroke-width: 1px;
@@ -320,7 +329,7 @@ onBeforeUnmount(() => {
}
.connection-line {
- stroke: blue;
+ stroke: red;
stroke-width: 1;
stroke-opacity: 0.5;
}
diff --git a/freedata_gui/src/components/main_left_navbar.vue b/freedata_gui/src/components/main_left_navbar.vue
index 0f7d47391..48920c4cf 100644
--- a/freedata_gui/src/components/main_left_navbar.vue
+++ b/freedata_gui/src/components/main_left_navbar.vue
@@ -22,102 +22,117 @@ import { useStateStore } from '../store/stateStore.js';
const state = useStateStore(pinia);
const isNetworkDisconnected = computed(() => state.modem_connection !== "connected");
+// Accessing the network traffic state
+const isNetworkTraffic = computed(() => state.is_network_traffic);
-
-
- Healthcheck
-
+
+
+
+
+
+
-
diff --git a/freedata_gui/src/components/main_loading_screen.vue b/freedata_gui/src/components/main_loading_screen.vue
new file mode 100644
index 000000000..5c3ffef4d
--- /dev/null
+++ b/freedata_gui/src/components/main_loading_screen.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
diff --git a/freedata_gui/src/js/api.js b/freedata_gui/src/js/api.js
index 68ba934af..69560c8f7 100644
--- a/freedata_gui/src/js/api.js
+++ b/freedata_gui/src/js/api.js
@@ -30,11 +30,17 @@ function checkNetworkConnectivity() {
}
return true;
}
+// Set network traffic state
+function setNetworkTrafficBusy(isBusy) {
+ state.is_network_traffic = isBusy;
+}
// Fetch GET request
async function apiGet(endpoint) {
if (!checkNetworkConnectivity()) return;
+ setNetworkTrafficBusy(true); // Set the network busy state to true
+
try {
const response = await fetch(buildURL(endpoint));
if (!response.ok) {
@@ -43,6 +49,8 @@ async function apiGet(endpoint) {
return await response.json();
} catch (error) {
console.error("Error getting from REST:", error);
+ } finally {
+ setNetworkTrafficBusy(false); // Set the network busy state back to false
}
}
@@ -50,6 +58,8 @@ async function apiGet(endpoint) {
export async function apiPost(endpoint, payload = {}) {
if (!checkNetworkConnectivity()) return;
+ setNetworkTrafficBusy(true); // Set the network busy state to true
+
try {
const response = await fetch(buildURL(endpoint), {
method: "POST",
@@ -66,6 +76,8 @@ export async function apiPost(endpoint, payload = {}) {
return await response.json();
} catch (error) {
console.error("Error posting to REST:", error);
+ } finally {
+ setNetworkTrafficBusy(false); // Set the network busy state back to false
}
}
@@ -73,6 +85,8 @@ export async function apiPost(endpoint, payload = {}) {
export async function apiPatch(endpoint, payload = {}) {
if (!checkNetworkConnectivity()) return;
+ setNetworkTrafficBusy(true); // Set the network busy state to true
+
try {
const response = await fetch(buildURL(endpoint), {
method: "PATCH",
@@ -89,6 +103,8 @@ export async function apiPatch(endpoint, payload = {}) {
return await response.json();
} catch (error) {
console.error("Error patching to REST:", error);
+ } finally {
+ setNetworkTrafficBusy(false); // Set the network busy state back to false
}
}
@@ -96,6 +112,8 @@ export async function apiPatch(endpoint, payload = {}) {
export async function apiDelete(endpoint, payload = {}) {
if (!checkNetworkConnectivity()) return;
+ setNetworkTrafficBusy(true); // Set the network busy state to true
+
try {
const response = await fetch(buildURL(endpoint), {
method: "DELETE",
@@ -112,6 +130,8 @@ export async function apiDelete(endpoint, payload = {}) {
return await response.json();
} catch (error) {
console.error("Error deleting from REST:", error);
+ } finally {
+ setNetworkTrafficBusy(false); // Set the network busy state back to false
}
}
diff --git a/freedata_gui/src/store/stateStore.js b/freedata_gui/src/store/stateStore.js
index 5c365d190..18bb39ffc 100644
--- a/freedata_gui/src/store/stateStore.js
+++ b/freedata_gui/src/store/stateStore.js
@@ -1,6 +1,5 @@
import { defineStore } from "pinia";
import { ref } from "vue";
-//import * as bootstrap from "bootstrap";
export const useStateStore = defineStore("stateStore", () => {
var busy_state = ref();
@@ -93,6 +92,9 @@ export const useStateStore = defineStore("stateStore", () => {
var rx_buffer_length = ref();
+ // New state for network traffic
+ var is_network_traffic = ref(false);
+
return {
dxcallsign,
busy_state,
@@ -148,5 +150,6 @@ export const useStateStore = defineStore("stateStore", () => {
os_info,
rx_buffer_length,
radio_status,
+ is_network_traffic,
};
});
diff --git a/freedata_server/server.py b/freedata_server/server.py
index 17d98e8d3..18174ac03 100644
--- a/freedata_server/server.py
+++ b/freedata_server/server.py
@@ -46,7 +46,7 @@
CONFIG_ENV_VAR = 'FREEDATA_CONFIG'
DEFAULT_CONFIG_FILE = 'config.ini'
-MODEM_VERSION = "0.16.6-alpha"
+MODEM_VERSION = "0.16.7-alpha"
API_VERSION = 3
LICENSE = 'GPL3.0'
diff --git a/freedata_server/stats.py b/freedata_server/stats.py
index 68d64cdf6..0ad1ed08e 100644
--- a/freedata_server/stats.py
+++ b/freedata_server/stats.py
@@ -12,8 +12,8 @@
log = structlog.get_logger("stats")
-# we have to move the modem version, its a duplicate
-MODEM_VERSION = "0.16.5-alpha"
+# we have to move the modem version, its a duplicate
+MODEM_VERSION = "0.16.7-alpha"
class stats():
diff --git a/setup.py b/setup.py
index 6ee8587be..bd08789fd 100644
--- a/setup.py
+++ b/setup.py
@@ -9,7 +9,7 @@
setup(
name='freedata',
- version='0.16.6a1',
+ version='0.16.7',
packages=find_packages(where='.'),
package_dir={'': '.'},
install_requires=required,