diff --git a/gui/src/assets/waterfall/spectrum.js b/gui/src/assets/waterfall/spectrum.js
index 1e75e548..11aadd24 100644
--- a/gui/src/assets/waterfall/spectrum.js
+++ b/gui/src/assets/waterfall/spectrum.js
@@ -105,6 +105,8 @@ Spectrum.prototype.drawSpectrum = function () {
var linePositionHigh = 178.4; //150 + bandwidth/20
var linePositionLow2 = 65; //150 - bandwith/20
var linePositionHigh2 = 235; //150 + bandwith/20
+ var linePositionLow3 = 28.1; //150 - bandwith/20
+ var linePositionHigh3 = 271.9; //150 + bandwith/20
this.ctx_wf.beginPath();
this.ctx_wf.moveTo(linePositionLow, 0);
this.ctx_wf.lineTo(linePositionLow, height);
@@ -114,6 +116,10 @@ Spectrum.prototype.drawSpectrum = function () {
this.ctx_wf.lineTo(linePositionLow2, height);
this.ctx_wf.moveTo(linePositionHigh2, 0);
this.ctx_wf.lineTo(linePositionHigh2, height);
+ this.ctx_wf.moveTo(linePositionLow3, 0);
+ this.ctx_wf.lineTo(linePositionLow3, height);
+ this.ctx_wf.moveTo(linePositionHigh3, 0);
+ this.ctx_wf.lineTo(linePositionHigh3, height);
this.ctx_wf.lineWidth = 1;
this.ctx_wf.strokeStyle = "#C3C3C3";
this.ctx_wf.stroke();
diff --git a/gui/src/components/grid/grid_active_broadcasts_vert.vue b/gui/src/components/grid/grid_active_broadcasts_vert.vue
index f1290fdc..754ded2c 100644
--- a/gui/src/components/grid/grid_active_broadcasts_vert.vue
+++ b/gui/src/components/grid/grid_active_broadcasts_vert.vue
@@ -15,11 +15,22 @@ function transmitPing() {
function startStopBeacon() {
if (state.beacon_state === true) {
- setModemBeacon(false);
+ setModemBeacon(false, state.away_from_key);
} else {
- setModemBeacon(true);
+ setModemBeacon(true, state.away_from_key);
}
}
+
+function setAwayFromKey(){
+ if (state.away_from_key === true) {
+ setModemBeacon(state.beacon_state, false);
+ } else {
+ setModemBeacon(state.beacon_state, true);
+ }
+
+}
+
+
var dxcallPing = ref("");
window.addEventListener(
"stationSelected",
@@ -84,6 +95,22 @@ window.addEventListener(
>
+
+
diff --git a/gui/src/js/api.js b/gui/src/js/api.js
index 2cd05108..7e469fac 100644
--- a/gui/src/js/api.js
+++ b/gui/src/js/api.js
@@ -92,8 +92,8 @@ export async function getSerialDevices() {
return await apiGet("/devices/serial");
}
-export async function setModemBeacon(enabled = false) {
- return await apiPost("/modem/beacon", { enabled: enabled });
+export async function setModemBeacon(enabled = false, afk = false) {
+ return await apiPost("/modem/beacon", { enabled: enabled, afk: afk});
}
export async function sendModemCQ() {
diff --git a/gui/src/js/eventHandler.js b/gui/src/js/eventHandler.js
index dd95a156..0fa5db26 100644
--- a/gui/src/js/eventHandler.js
+++ b/gui/src/js/eventHandler.js
@@ -30,8 +30,11 @@ import {
getRemote,
} from "../store/settingsStore.js";
-export function loadAllData() {
- getModemState();
+export async function loadAllData() {
+ // TODO: Make this working
+ let stateData = await getModemState();
+ console.log(stateData)
+
getRemote();
getOverallHealth();
audioStore.loadAudioDevices();
@@ -67,7 +70,10 @@ export function stateDispatcher(data) {
);
stateStore.channel_busy_slot = data["channel_busy_slot"];
+
stateStore.beacon_state = data["is_beacon_running"];
+ stateStore.is_away_from_key = data["is_away_from_key"];
+
stateStore.radio_status = data["radio_status"];
stateStore.frequency = data["radio_frequency"];
stateStore.mode = data["radio_mode"];
diff --git a/gui/src/store/stateStore.js b/gui/src/store/stateStore.js
index e65a331c..c17af8b9 100644
--- a/gui/src/store/stateStore.js
+++ b/gui/src/store/stateStore.js
@@ -38,6 +38,7 @@ export const useStateStore = defineStore("stateStore", () => {
var arq_session_state = ref("");
var arq_state = ref("");
var beacon_state = ref(false);
+ var away_from_key = ref(false);
var audio_recording = ref(false);
diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py
index adddddf4..af6b3efa 100644
--- a/modem/data_frame_factory.py
+++ b/modem/data_frame_factory.py
@@ -18,6 +18,10 @@ class DataFrameFactory:
'CHECKSUM': 2, # Bit-position for indicating the CHECKSUM is correct or not
}
+ BEACON_FLAGS = {
+ 'AWAY_FROM_KEY': 0, # Bit-position for indicating the AWAY FROM KEY state
+ }
+
def __init__(self, config):
self.myfullcall = f"{config['STATION']['mycall']}-{config['STATION']['myssid']}"
@@ -51,7 +55,8 @@ class DataFrameFactory:
self.template_list[FR_TYPE.BEACON.value] = {
"frame_length": self.LENGTH_SIG0_FRAME,
"origin": 6,
- "gridsquare": 4
+ "gridsquare": 4,
+ "flag": 1
}
def _load_ping_templates(self):
@@ -287,6 +292,15 @@ class DataFrameFactory:
# Update extracted_data with the status of each flag
# get_flag returns True or False based on the bit value at the flag's position
extracted_data[key][flag] = helpers.get_flag(data, flag, flag_dict)
+
+ if frametype in [FR_TYPE.BEACON]:
+ flag_dict = self.BEACON_FLAGS
+ for flag in flag_dict:
+ # Update extracted_data with the status of each flag
+ # get_flag returns True or False based on the bit value at the flag's position
+ extracted_data[key][flag] = helpers.get_flag(data, flag, flag_dict)
+
+
else:
extracted_data[key] = data
@@ -342,10 +356,16 @@ class DataFrameFactory:
}
return self.construct(FR_TYPE.QRV, payload)
- def build_beacon(self):
+ def build_beacon(self, flag_away_from_key = False):
+ flag = 0b00000000
+ if flag_away_from_key:
+ flag = helpers.set_flag(flag, 'AWAY_FROM_KEY', True, self.BEACON_FLAGS)
+
payload = {
"origin": helpers.callsign_to_bytes(self.myfullcall),
- "gridsquare": helpers.encode_grid(self.mygrid)
+ "gridsquare": helpers.encode_grid(self.mygrid),
+ "flag": flag.to_bytes(1, 'big'),
+
}
return self.construct(FR_TYPE.BEACON, payload)
diff --git a/modem/server.py b/modem/server.py
index c723d3b6..409b4de2 100644
--- a/modem/server.py
+++ b/modem/server.py
@@ -33,7 +33,7 @@ from schedule_manager import ScheduleManager
app = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})
sock = Sock(app)
-MODEM_VERSION = "0.15.1-alpha"
+MODEM_VERSION = "0.15.2-alpha"
# set config file to use
def set_config():
@@ -146,14 +146,15 @@ def post_cqcqcq():
def post_beacon():
if request.method not in ['POST']:
return api_response({"info": "endpoint for controlling BEACON STATE via POST"})
-
- if not isinstance(request.json['enabled'], bool):
+ if not isinstance(request.json['enabled'], bool) or not isinstance(request.json['afk'], bool):
api_abort(f"Incorrect value for 'enabled'. Shoud be bool.")
if not app.state_manager.is_modem_running:
api_abort('Modem not running', 503)
if not app.state_manager.is_beacon_running:
app.state_manager.set('is_beacon_running', request.json['enabled'])
+ app.state_manager.set('is_away_from_key', request.json['afk'])
+
if not app.state_manager.getARQ():
enqueue_tx_command(command_beacon.BeaconCommand, request.json)
else:
diff --git a/modem/state_manager.py b/modem/state_manager.py
index ca65e4fb..a3464370 100644
--- a/modem/state_manager.py
+++ b/modem/state_manager.py
@@ -23,6 +23,7 @@ class StateManager:
self.setARQ(False)
self.is_beacon_running = False
+ self.is_away_from_key = False
# If true, any wait() call is blocking
self.transmitting_event = threading.Event()
@@ -84,6 +85,7 @@ class StateManager:
"type": msgtype,
"is_modem_running": self.is_modem_running,
"is_beacon_running": self.is_beacon_running,
+ "is_away_from_key": self.is_away_from_key,
"radio_status": self.radio_status,
"radio_frequency": self.radio_frequency,
"radio_mode": self.radio_mode,