mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
commit
dc67b5632d
15 changed files with 1 additions and 1558 deletions
|
@ -5,16 +5,9 @@ setActivePinia(pinia);
|
||||||
|
|
||||||
import main_modals from "./main_modals.vue";
|
import main_modals from "./main_modals.vue";
|
||||||
import main_top_navbar from "./main_top_navbar.vue";
|
import main_top_navbar from "./main_top_navbar.vue";
|
||||||
import main_rig_control from "./main_rig_control.vue";
|
|
||||||
import settings_view from "./settings.vue";
|
import settings_view from "./settings.vue";
|
||||||
import main_active_rig_control from "./main_active_rig_control.vue";
|
|
||||||
import main_footer_navbar from "./main_footer_navbar.vue";
|
import main_footer_navbar from "./main_footer_navbar.vue";
|
||||||
|
|
||||||
import main_active_stats from "./main_active_stats.vue";
|
|
||||||
import main_active_broadcasts from "./main_active_broadcasts.vue";
|
|
||||||
import main_active_heard_stations from "./main_active_heard_stations.vue";
|
|
||||||
import main_active_audio_level from "./main_active_audio_level.vue";
|
|
||||||
|
|
||||||
import chat from "./chat.vue";
|
import chat from "./chat.vue";
|
||||||
import infoScreen from "./infoScreen.vue";
|
import infoScreen from "./infoScreen.vue";
|
||||||
import main_modem_healthcheck from "./main_modem_healthcheck.vue";
|
import main_modem_healthcheck from "./main_modem_healthcheck.vue";
|
||||||
|
|
|
@ -1,170 +0,0 @@
|
||||||
<script setup lang="ts">
|
|
||||||
import { setActivePinia } from "pinia";
|
|
||||||
import pinia from "../store/index";
|
|
||||||
setActivePinia(pinia);
|
|
||||||
|
|
||||||
import { useStateStore } from "../store/stateStore.js";
|
|
||||||
const state = useStateStore(pinia);
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div class="card mb-1">
|
|
||||||
<div class="card-header p-1">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-1">
|
|
||||||
<i class="bi bi-volume-up" style="font-size: 1.2rem"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-3">
|
|
||||||
<strong>Audio</strong>
|
|
||||||
</div>
|
|
||||||
<div class="col-7">
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
id="audioModalButton"
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#audioModal"
|
|
||||||
class="btn btn-sm btn-outline-secondary me-1"
|
|
||||||
>
|
|
||||||
Tune
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div class="col-1 text-end">
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
id="openHelpModalAudioLevel"
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#audioLevelHelpModal"
|
|
||||||
class="btn m-0 p-0 border-0"
|
|
||||||
>
|
|
||||||
<i class="bi bi-question-circle" style="font-size: 1rem"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm">
|
|
||||||
<div
|
|
||||||
class="progress mb-0 rounded-0 rounded-top"
|
|
||||||
style="height: 22px"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="progress-bar progress-bar-striped bg-primary force-gpu"
|
|
||||||
id="noise_level"
|
|
||||||
role="progressbar"
|
|
||||||
:style="{ width: state.s_meter_strength_percent + '%' }"
|
|
||||||
aria-valuenow="{{state.s_meter_strength_percent}}"
|
|
||||||
aria-valuemin="0"
|
|
||||||
aria-valuemax="100"
|
|
||||||
></div>
|
|
||||||
<p
|
|
||||||
class="justify-content-center d-flex position-absolute w-100"
|
|
||||||
id="noise_level_value"
|
|
||||||
>
|
|
||||||
S-Meter(dB): {{ state.s_meter_strength_raw }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="progress mb-0 rounded-0 rounded-bottom"
|
|
||||||
style="height: 8px"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="progress-bar progress-bar-striped bg-warning"
|
|
||||||
role="progressbar"
|
|
||||||
style="width: 1%"
|
|
||||||
aria-valuenow="1"
|
|
||||||
aria-valuemin="0"
|
|
||||||
aria-valuemax="100"
|
|
||||||
></div>
|
|
||||||
<div
|
|
||||||
class="progress-bar bg-success"
|
|
||||||
role="progressbar"
|
|
||||||
style="width: 89%"
|
|
||||||
aria-valuenow="50"
|
|
||||||
aria-valuemin="0"
|
|
||||||
aria-valuemax="100"
|
|
||||||
></div>
|
|
||||||
<div
|
|
||||||
class="progress-bar progress-bar-striped bg-warning"
|
|
||||||
role="progressbar"
|
|
||||||
style="width: 20%"
|
|
||||||
aria-valuenow="20"
|
|
||||||
aria-valuemin="0"
|
|
||||||
aria-valuemax="100"
|
|
||||||
></div>
|
|
||||||
<div
|
|
||||||
class="progress-bar progress-bar-striped bg-danger"
|
|
||||||
role="progressbar"
|
|
||||||
style="width: 29%"
|
|
||||||
aria-valuenow="29"
|
|
||||||
aria-valuemin="0"
|
|
||||||
aria-valuemax="100"
|
|
||||||
></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm">
|
|
||||||
<div
|
|
||||||
class="progress mb-0 rounded-0 rounded-top"
|
|
||||||
style="height: 22px"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="progress-bar progress-bar-striped bg-primary force-gpu"
|
|
||||||
id="dbfs_level"
|
|
||||||
role="progressbar"
|
|
||||||
:style="{ width: state.dbfs_level_percent + '%' }"
|
|
||||||
aria-valuenow="0"
|
|
||||||
aria-valuemin="0"
|
|
||||||
aria-valuemax="100"
|
|
||||||
></div>
|
|
||||||
<p
|
|
||||||
class="justify-content-center d-flex position-absolute w-100"
|
|
||||||
id="dbfs_level_value"
|
|
||||||
>
|
|
||||||
{{ state.dbfs_level }} dBFS
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="progress mb-0 rounded-0 rounded-bottom"
|
|
||||||
style="height: 8px"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="progress-bar progress-bar-striped bg-warning"
|
|
||||||
role="progressbar"
|
|
||||||
style="width: 1%"
|
|
||||||
aria-valuenow="1"
|
|
||||||
aria-valuemin="0"
|
|
||||||
aria-valuemax="100"
|
|
||||||
></div>
|
|
||||||
<div
|
|
||||||
class="progress-bar bg-success"
|
|
||||||
role="progressbar"
|
|
||||||
style="width: 89%"
|
|
||||||
aria-valuenow="50"
|
|
||||||
aria-valuemin="0"
|
|
||||||
aria-valuemax="100"
|
|
||||||
></div>
|
|
||||||
<div
|
|
||||||
class="progress-bar progress-bar-striped bg-warning"
|
|
||||||
role="progressbar"
|
|
||||||
style="width: 20%"
|
|
||||||
aria-valuenow="20"
|
|
||||||
aria-valuemin="0"
|
|
||||||
aria-valuemax="100"
|
|
||||||
></div>
|
|
||||||
<div
|
|
||||||
class="progress-bar progress-bar-striped bg-danger"
|
|
||||||
role="progressbar"
|
|
||||||
style="width: 29%"
|
|
||||||
aria-valuenow="29"
|
|
||||||
aria-valuemin="0"
|
|
||||||
aria-valuemax="100"
|
|
||||||
></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
|
@ -1,110 +0,0 @@
|
||||||
<script setup lang="ts">
|
|
||||||
|
|
||||||
import { setActivePinia } from "pinia";
|
|
||||||
import pinia from "../store/index";
|
|
||||||
setActivePinia(pinia);
|
|
||||||
|
|
||||||
import { settingsStore as settings} from "../store/settingsStore.js";
|
|
||||||
|
|
||||||
import { useStateStore } from "../store/stateStore.js";
|
|
||||||
const state = useStateStore(pinia);
|
|
||||||
|
|
||||||
import { sendModemCQ, sendModemPing, setModemBeacon } from "../js/api.js";
|
|
||||||
|
|
||||||
function transmitPing() {
|
|
||||||
sendModemPing((<HTMLInputElement>document.getElementById("dxCall")).value);
|
|
||||||
}
|
|
||||||
|
|
||||||
function startStopBeacon() {
|
|
||||||
if (state.beacon_state === true) {
|
|
||||||
setModemBeacon(false);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
setModemBeacon(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div class="card mb-1">
|
|
||||||
<div class="card-header p-1">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-1">
|
|
||||||
<i class="bi bi-broadcast" style="font-size: 1.2rem"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-10">
|
|
||||||
<strong class="fs-5">Broadcasts</strong>
|
|
||||||
</div>
|
|
||||||
<div class="col-1 text-end">
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
id="openHelpModalBroadcasts"
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#broadcastsHelpModal"
|
|
||||||
class="btn m-0 p-0 border-0"
|
|
||||||
>
|
|
||||||
<i class="bi bi-question-circle" style="font-size: 1rem"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-auto">
|
|
||||||
<div class="input-group input-group-sm mb-0">
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
class="form-control"
|
|
||||||
style="max-width: 6rem; text-transform: uppercase"
|
|
||||||
placeholder="DXcall"
|
|
||||||
pattern="[A-Z]*"
|
|
||||||
id="dxCall"
|
|
||||||
maxlength="11"
|
|
||||||
aria-label="Input group"
|
|
||||||
aria-describedby="btnGroupAddon"
|
|
||||||
/>
|
|
||||||
<button
|
|
||||||
class="btn btn-sm btn-outline-secondary ms-1"
|
|
||||||
id="sendPing"
|
|
||||||
type="button"
|
|
||||||
data-bs-placement="bottom"
|
|
||||||
data-bs-toggle="tooltip"
|
|
||||||
data-bs-trigger="hover"
|
|
||||||
data-bs-html="false"
|
|
||||||
title="Send a ping request to a remote station"
|
|
||||||
@click="transmitPing()"
|
|
||||||
>
|
|
||||||
Ping
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button
|
|
||||||
class="btn btn-sm btn-outline-secondary ms-1"
|
|
||||||
id="sendCQ"
|
|
||||||
type="button"
|
|
||||||
title="Send a CQ to the world"
|
|
||||||
@click="sendModemCQ()"
|
|
||||||
>
|
|
||||||
Call CQ
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
id="startBeacon"
|
|
||||||
class="btn btn-sm ms-1"
|
|
||||||
@click="startStopBeacon()"
|
|
||||||
v-bind:class="{
|
|
||||||
'btn-success': state.beacon_state === true,
|
|
||||||
'btn-outline-secondary': state.beacon_state === false,
|
|
||||||
}"
|
|
||||||
title="Toggle beacon mode. The interval can be set in settings. While sending a beacon, you can receive ping requests and open a datachannel. If a datachannel is opened, the beacon pauses."
|
|
||||||
>
|
|
||||||
<i class="bi bi-soundwave"></i> Toggle beacon
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- end of row-->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
|
@ -1,122 +0,0 @@
|
||||||
<script setup lang="ts">
|
|
||||||
// @ts-nocheck
|
|
||||||
const { distance } = require("qth-locator");
|
|
||||||
|
|
||||||
import { setActivePinia } from "pinia";
|
|
||||||
import pinia from "../store/index";
|
|
||||||
setActivePinia(pinia);
|
|
||||||
|
|
||||||
import { settingsStore as settings } from "../store/settingsStore.js";
|
|
||||||
|
|
||||||
import { useStateStore } from "../store/stateStore.js";
|
|
||||||
const state = useStateStore(pinia);
|
|
||||||
|
|
||||||
function getDateTime(timestampRaw) {
|
|
||||||
var datetime = new Date(timestampRaw * 1000).toLocaleString(
|
|
||||||
navigator.language,
|
|
||||||
{
|
|
||||||
hourCycle: "h23",
|
|
||||||
year: "numeric",
|
|
||||||
month: "2-digit",
|
|
||||||
day: "2-digit",
|
|
||||||
hour: "2-digit",
|
|
||||||
minute: "2-digit",
|
|
||||||
second: "2-digit",
|
|
||||||
},
|
|
||||||
);
|
|
||||||
return datetime;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getMaidenheadDistance(dxGrid) {
|
|
||||||
if (typeof dxGrid != "undefined") {
|
|
||||||
try {
|
|
||||||
return parseInt(distance(settings.remote.STATION.mygrid, dxGrid));
|
|
||||||
} catch (e) {
|
|
||||||
console.warn(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div class="card mb-1 h-100">
|
|
||||||
<!--325px-->
|
|
||||||
<div class="card-header p-1">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-auto">
|
|
||||||
<i class="bi bi-list-columns-reverse" style="font-size: 1.2rem"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-10">
|
|
||||||
<strong class="fs-5">Heard stations</strong>
|
|
||||||
</div>
|
|
||||||
<div class="col-1 text-end">
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
id="openHelpModalHeardStations"
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#heardStationsHelpModal"
|
|
||||||
class="btn m-0 p-0 border-0"
|
|
||||||
>
|
|
||||||
<i class="bi bi-question-circle" style="font-size: 1rem"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-0" style="overflow-y: overlay">
|
|
||||||
<div class="table-responsive">
|
|
||||||
<!-- START OF TABLE FOR HEARD STATIONS -->
|
|
||||||
<table class="table table-sm" id="tblHeardStationList">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col" id="thTime">
|
|
||||||
<i id="hslSort" class="bi bi-sort-up"></i>Time
|
|
||||||
</th>
|
|
||||||
<th scope="col" id="thFreq">Freq</th>
|
|
||||||
<th scope="col" id="thDxcall">DXCall</th>
|
|
||||||
<th scope="col" id="thDxgrid">Grid</th>
|
|
||||||
<th scope="col" id="thDist">Dist</th>
|
|
||||||
<th scope="col" id="thType">Type</th>
|
|
||||||
<th scope="col" id="thSnr">SNR</th>
|
|
||||||
<!--<th scope="col">Off</th>-->
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="heardstations">
|
|
||||||
<!--https://vuejs.org/guide/essentials/list.html-->
|
|
||||||
<tr v-for="item in state.heard_stations" :key="item.origin">
|
|
||||||
<td>
|
|
||||||
<span class="badge bg-secondary">{{
|
|
||||||
getDateTime(item.timestamp)
|
|
||||||
}}</span>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<span class="badge bg-secondary"
|
|
||||||
>{{ item.frequency / 1000 }} kHz</span
|
|
||||||
>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<span class="badge bg-secondary">{{ item.origin }}</span>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<span class="badge bg-secondary">{{ item.gridsquare }}</span>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<span class="badge bg-secondary"
|
|
||||||
>{{ getMaidenheadDistance(item.gridsquare) }} km</span
|
|
||||||
>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<span class="badge bg-secondary">{{ item.activity_type }}</span>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<span class="badge bg-secondary">{{ item.snr }}</span>
|
|
||||||
</td>
|
|
||||||
<!--<td>{{ item.offset }}</td>-->
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!-- END OF HEARD STATIONS TABLE -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
|
@ -1,261 +0,0 @@
|
||||||
<script setup lang="ts">
|
|
||||||
import { setActivePinia } from "pinia";
|
|
||||||
import pinia from "../store/index";
|
|
||||||
setActivePinia(pinia);
|
|
||||||
|
|
||||||
import { useStateStore } from "../store/stateStore.js";
|
|
||||||
const state = useStateStore(pinia);
|
|
||||||
|
|
||||||
import { setRadioParametersFrequency, setRadioParametersMode, setRadioParametersRFLevel } from "../js/api";
|
|
||||||
|
|
||||||
function updateFrequencyAndApply(frequency) {
|
|
||||||
state.new_frequency = frequency;
|
|
||||||
set_radio_parameter_frequency();
|
|
||||||
}
|
|
||||||
|
|
||||||
function set_radio_parameter_frequency(){
|
|
||||||
setRadioParametersFrequency(state.new_frequency)
|
|
||||||
}
|
|
||||||
|
|
||||||
function set_radio_parameter_mode(){
|
|
||||||
setRadioParametersMode(state.mode)
|
|
||||||
}
|
|
||||||
|
|
||||||
function set_radio_parameter_rflevel(){
|
|
||||||
setRadioParametersRFLevel(state.rf_level)
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="mb-3">
|
|
||||||
<div class="card mb-1">
|
|
||||||
<div class="card-header p-1">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-1">
|
|
||||||
<i class="bi bi-house-door" style="font-size: 1.2rem"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-10">
|
|
||||||
<strong class="fs-5 me-2">Radio control</strong>
|
|
||||||
<span
|
|
||||||
class="badge"
|
|
||||||
v-bind:class="{
|
|
||||||
'text-bg-success': state.hamlib_status === 'connected',
|
|
||||||
'text-bg-danger disabled':
|
|
||||||
state.hamlib_status === 'disconnected',
|
|
||||||
}"
|
|
||||||
>{{ state.hamlib_status }}</span
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div class="col-1 text-end">
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
id="openHelpModalStation"
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#stationHelpModal"
|
|
||||||
class="btn m-0 p-0 border-0"
|
|
||||||
disabled
|
|
||||||
>
|
|
||||||
<i class="bi bi-question-circle" style="font-size: 1rem"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<div class="input-group input-group-sm bottom-0 m-0">
|
|
||||||
<div class="me-2">
|
|
||||||
<div class="input-group input-group-sm">
|
|
||||||
<span class="input-group-text">QRG</span>
|
|
||||||
<span class="input-group-text">{{ state.frequency }} Hz</span>
|
|
||||||
|
|
||||||
<!-- Dropdown Button -->
|
|
||||||
<button
|
|
||||||
v-bind:class="{
|
|
||||||
disabled: state.hamlib_status === 'disconnected',
|
|
||||||
}"
|
|
||||||
class="btn btn-secondary dropdown-toggle"
|
|
||||||
type="button"
|
|
||||||
id="dropdownMenuButton"
|
|
||||||
data-bs-toggle="dropdown"
|
|
||||||
aria-expanded="false"
|
|
||||||
></button>
|
|
||||||
|
|
||||||
<!-- Dropdown Menu -->
|
|
||||||
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton">
|
|
||||||
<li>
|
|
||||||
<div class="input-group p-1">
|
|
||||||
<span class="input-group-text">frequency</span>
|
|
||||||
|
|
||||||
<input
|
|
||||||
v-model="state.new_frequency"
|
|
||||||
style="max-width: 8rem"
|
|
||||||
pattern="[0-9]*"
|
|
||||||
type="text"
|
|
||||||
class="form-control form-control-sm"
|
|
||||||
v-bind:class="{
|
|
||||||
disabled: state.hamlib_status === 'disconnected',
|
|
||||||
}"
|
|
||||||
placeholder="Type frequency..."
|
|
||||||
aria-label="Frequency"
|
|
||||||
/>
|
|
||||||
<button
|
|
||||||
class="btn btn-sm btn-outline-success"
|
|
||||||
type="button"
|
|
||||||
@click="updateFrequencyAndApply(state.new_frequency)"
|
|
||||||
v-bind:class="{
|
|
||||||
disabled: state.hamlib_status === 'disconnected',
|
|
||||||
}"
|
|
||||||
>
|
|
||||||
<i class="bi bi-check-square"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<!-- Dropdown Divider -->
|
|
||||||
<li><hr class="dropdown-divider" /></li>
|
|
||||||
<!-- Dropdown Items -->
|
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
class="dropdown-item"
|
|
||||||
href="#"
|
|
||||||
@click="updateFrequencyAndApply(50616000)"
|
|
||||||
><strong>50616 kHz</strong>
|
|
||||||
<span class="badge bg-secondary">6m | USB</span>
|
|
||||||
<span class="badge bg-info">EU | US</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
class="dropdown-item"
|
|
||||||
href="#"
|
|
||||||
@click="updateFrequencyAndApply(50308000)"
|
|
||||||
><strong>50308 kHz</strong>
|
|
||||||
<span class="badge bg-secondary">6m | USB</span>
|
|
||||||
<span class="badge bg-info">US</span></a
|
|
||||||
>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
class="dropdown-item"
|
|
||||||
href="#"
|
|
||||||
@click="updateFrequencyAndApply(28093000)"
|
|
||||||
><strong>28093 kHz</strong>
|
|
||||||
<span class="badge bg-secondary">10m | USB</span>
|
|
||||||
<span class="badge bg-info">EU | US</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
class="dropdown-item"
|
|
||||||
href="#"
|
|
||||||
@click="updateFrequencyAndApply(27265000)"
|
|
||||||
><strong>27265 kHz</strong>
|
|
||||||
<span class="badge bg-secondary">11m | USB</span>
|
|
||||||
<span class="badge bg-dark">Ch 26</span></a
|
|
||||||
>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
class="dropdown-item"
|
|
||||||
href="#"
|
|
||||||
@click="updateFrequencyAndApply(27245000)"
|
|
||||||
><strong>27245 kHz</strong>
|
|
||||||
<span class="badge bg-secondary">11m | USB</span>
|
|
||||||
<span class="badge bg-dark">Ch 25</span></a
|
|
||||||
>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
class="dropdown-item"
|
|
||||||
href="#"
|
|
||||||
@click="updateFrequencyAndApply(24908000)"
|
|
||||||
><strong>24908 kHz</strong>
|
|
||||||
<span class="badge bg-secondary">12m | USB</span>
|
|
||||||
<span class="badge bg-info">EU | US</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
class="dropdown-item"
|
|
||||||
href="#"
|
|
||||||
@click="updateFrequencyAndApply(21093000)"
|
|
||||||
><strong>21093 kHz</strong>
|
|
||||||
<span class="badge bg-secondary">15m | USB</span>
|
|
||||||
<span class="badge bg-info">EU | US</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
class="dropdown-item"
|
|
||||||
href="#"
|
|
||||||
@click="updateFrequencyAndApply(14093000)"
|
|
||||||
><strong>14093 kHz</strong>
|
|
||||||
<span class="badge bg-secondary">20m | USB</span>
|
|
||||||
<span class="badge bg-info">EU | US</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
class="dropdown-item"
|
|
||||||
href="#"
|
|
||||||
@click="updateFrequencyAndApply(7053000)"
|
|
||||||
><strong>7053 kHz</strong>
|
|
||||||
<span class="badge bg-secondary">40m | USB</span>
|
|
||||||
<span class="badge bg-info">EU | US</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="me-2">
|
|
||||||
<div class="input-group input-group-sm">
|
|
||||||
<span class="input-group-text">Mode</span>
|
|
||||||
<select
|
|
||||||
class="form-control"
|
|
||||||
v-model="state.mode"
|
|
||||||
@click="set_radio_parameter_mode()"
|
|
||||||
v-bind:class="{
|
|
||||||
disabled: state.hamlib_status === 'disconnected',
|
|
||||||
}"
|
|
||||||
>
|
|
||||||
<option value="USB">USB</option>
|
|
||||||
<option value="USB-D">USB-D</option>
|
|
||||||
<option value="PKTUSB">PKT-U</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="me-2">
|
|
||||||
<div class="input-group input-group-sm">
|
|
||||||
<span class="input-group-text">Power</span>
|
|
||||||
<select
|
|
||||||
class="form-control"
|
|
||||||
v-model="state.rf_level"
|
|
||||||
@click="set_radio_parameter_rflevel()"
|
|
||||||
v-bind:class="{
|
|
||||||
disabled: state.hamlib_status === 'disconnected',
|
|
||||||
}"
|
|
||||||
>
|
|
||||||
<option value="0">-</option>
|
|
||||||
<option value="10">10</option>
|
|
||||||
<option value="20">20</option>
|
|
||||||
<option value="30">30</option>
|
|
||||||
<option value="40">40</option>
|
|
||||||
<option value="50">50</option>
|
|
||||||
<option value="60">60</option>
|
|
||||||
<option value="70">70</option>
|
|
||||||
<option value="80">80</option>
|
|
||||||
<option value="90">90</option>
|
|
||||||
<option value="100">100</option>
|
|
||||||
</select>
|
|
||||||
<span class="input-group-text">%</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
|
@ -1,402 +0,0 @@
|
||||||
<script setup lang="ts">
|
|
||||||
// @ts-nocheck
|
|
||||||
// reason for no check is, that we have some mixing of typescript and chart js which seems to be not to be fixed that easy
|
|
||||||
|
|
||||||
import { setActivePinia } from "pinia";
|
|
||||||
import pinia from "../store/index";
|
|
||||||
setActivePinia(pinia);
|
|
||||||
|
|
||||||
import { settingsStore as settings } from "../store/settingsStore.js";
|
|
||||||
|
|
||||||
import { useStateStore } from "../store/stateStore.js";
|
|
||||||
const state = useStateStore(pinia);
|
|
||||||
|
|
||||||
import {
|
|
||||||
Chart as ChartJS,
|
|
||||||
CategoryScale,
|
|
||||||
LinearScale,
|
|
||||||
PointElement,
|
|
||||||
LineElement,
|
|
||||||
Title,
|
|
||||||
Tooltip,
|
|
||||||
Legend,
|
|
||||||
} from "chart.js";
|
|
||||||
import { Line, Scatter } from "vue-chartjs";
|
|
||||||
import { computed } from "vue";
|
|
||||||
|
|
||||||
function selectStatsControl(obj) {
|
|
||||||
switch (obj.delegateTarget.id) {
|
|
||||||
case "list-waterfall-list":
|
|
||||||
settings.local.spectrum = "waterfall";
|
|
||||||
break;
|
|
||||||
case "list-scatter-list":
|
|
||||||
settings.local.spectrum = "scatter";
|
|
||||||
break;
|
|
||||||
case "list-chart-list":
|
|
||||||
settings.local.spectrum = "chart";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
settings.local.spectrum = "waterfall";
|
|
||||||
}
|
|
||||||
//saveSettingsToFile();
|
|
||||||
}
|
|
||||||
|
|
||||||
ChartJS.register(
|
|
||||||
CategoryScale,
|
|
||||||
LinearScale,
|
|
||||||
PointElement,
|
|
||||||
LineElement,
|
|
||||||
Title,
|
|
||||||
Tooltip,
|
|
||||||
Legend,
|
|
||||||
);
|
|
||||||
|
|
||||||
// https://www.chartjs.org/docs/latest/samples/line/segments.html
|
|
||||||
const skipped = (speedCtx, value) =>
|
|
||||||
speedCtx.p0.skip || speedCtx.p1.skip ? value : undefined;
|
|
||||||
const down = (speedCtx, value) =>
|
|
||||||
speedCtx.p0.parsed.y > speedCtx.p1.parsed.y ? value : undefined;
|
|
||||||
|
|
||||||
var transmissionSpeedChartOptions = {
|
|
||||||
//type: "line",
|
|
||||||
responsive: true,
|
|
||||||
animations: true,
|
|
||||||
maintainAspectRatio: false,
|
|
||||||
cubicInterpolationMode: "monotone",
|
|
||||||
tension: 0.4,
|
|
||||||
scales: {
|
|
||||||
SNR: {
|
|
||||||
type: "linear",
|
|
||||||
ticks: { beginAtZero: false, color: "rgb(255, 99, 132)" },
|
|
||||||
position: "right",
|
|
||||||
},
|
|
||||||
SPEED: {
|
|
||||||
type: "linear",
|
|
||||||
ticks: { beginAtZero: false, color: "rgb(120, 100, 120)" },
|
|
||||||
position: "left",
|
|
||||||
grid: {
|
|
||||||
drawOnChartArea: false, // only want the grid lines for one axis to show up
|
|
||||||
},
|
|
||||||
},
|
|
||||||
x: { ticks: { beginAtZero: true } },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const transmissionSpeedChartData = computed(() => ({
|
|
||||||
labels: state.arq_speed_list_timestamp,
|
|
||||||
datasets: [
|
|
||||||
{
|
|
||||||
type: "line",
|
|
||||||
label: "SNR[dB]",
|
|
||||||
data: state.arq_speed_list_snr,
|
|
||||||
borderColor: "rgb(75, 192, 192, 1.0)",
|
|
||||||
pointRadius: 1,
|
|
||||||
segment: {
|
|
||||||
borderColor: (speedCtx) =>
|
|
||||||
skipped(speedCtx, "rgb(0,0,0,0.4)") ||
|
|
||||||
down(speedCtx, "rgb(192,75,75)"),
|
|
||||||
borderDash: (speedCtx) => skipped(speedCtx, [3, 3]),
|
|
||||||
},
|
|
||||||
spanGaps: true,
|
|
||||||
backgroundColor: "rgba(75, 192, 192, 0.2)",
|
|
||||||
order: 1,
|
|
||||||
yAxisID: "SNR",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: "bar",
|
|
||||||
label: "Speed[bpm]",
|
|
||||||
data: state.arq_speed_list_bpm,
|
|
||||||
borderColor: "rgb(120, 100, 120, 1.0)",
|
|
||||||
backgroundColor: "rgba(120, 100, 120, 0.2)",
|
|
||||||
order: 0,
|
|
||||||
yAxisID: "SPEED",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}));
|
|
||||||
|
|
||||||
const scatterChartOptions = {
|
|
||||||
responsive: true,
|
|
||||||
maintainAspectRatio: false,
|
|
||||||
scales: {
|
|
||||||
x: {
|
|
||||||
type: "linear",
|
|
||||||
position: "bottom",
|
|
||||||
grid: {
|
|
||||||
display: true,
|
|
||||||
lineWidth: 1, // Set the line width for x-axis grid lines
|
|
||||||
},
|
|
||||||
ticks: {
|
|
||||||
display: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
y: {
|
|
||||||
type: "linear",
|
|
||||||
position: "left",
|
|
||||||
grid: {
|
|
||||||
display: true,
|
|
||||||
lineWidth: 1, // Set the line width for y-axis grid lines
|
|
||||||
},
|
|
||||||
ticks: {
|
|
||||||
display: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
plugins: {
|
|
||||||
legend: {
|
|
||||||
display: false,
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
enabled: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
// dummy data
|
|
||||||
//state.scatter = [{"x":"166","y":"46"},{"x":"-193","y":"-139"},{"x":"-165","y":"-291"},{"x":"311","y":"-367"},{"x":"389","y":"199"},{"x":"78","y":"372"},{"x":"242","y":"-431"},{"x":"-271","y":"-248"},{"x":"28","y":"-130"},{"x":"-20","y":"187"},{"x":"74","y":"362"},{"x":"-316","y":"-229"},{"x":"-180","y":"261"},{"x":"321","y":"360"},{"x":"438","y":"-288"},{"x":"378","y":"-94"},{"x":"462","y":"-163"},{"x":"-265","y":"248"},{"x":"210","y":"314"},{"x":"230","y":"-320"},{"x":"261","y":"-244"},{"x":"-283","y":"-373"}]
|
|
||||||
|
|
||||||
const scatterChartData = computed(() => ({
|
|
||||||
datasets: [
|
|
||||||
{
|
|
||||||
type: "scatter",
|
|
||||||
fill: true,
|
|
||||||
data: state.scatter,
|
|
||||||
label: "Scatter",
|
|
||||||
tension: 0.1,
|
|
||||||
borderColor: "rgb(0, 255, 0)",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}));
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import { initWaterfall, setColormap } from "../js/waterfallHandler.js";
|
|
||||||
var localSpectrum;
|
|
||||||
export default {
|
|
||||||
mounted() {
|
|
||||||
// This code will be executed after the component is mounted to the DOM
|
|
||||||
// You can access DOM elements or perform other initialization here
|
|
||||||
//const myElement = this.$refs.waterfall; // Access the DOM element with ref
|
|
||||||
|
|
||||||
// init waterfall
|
|
||||||
localSpectrum = initWaterfall("waterfall-main");
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="card mb-1" style="height: calc(var(--variable-height) - 20px)">
|
|
||||||
<div class="card-header p-1">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-11 p-0">
|
|
||||||
<div class="btn-group h-100" role="group">
|
|
||||||
<div
|
|
||||||
class="list-group bg-body-tertiary list-group-horizontal"
|
|
||||||
id="list-tab"
|
|
||||||
role="tablist"
|
|
||||||
>
|
|
||||||
<a
|
|
||||||
class="py-0 list-group-item list-group-item-dark list-group-item-action"
|
|
||||||
id="list-waterfall-list"
|
|
||||||
data-bs-toggle="list"
|
|
||||||
href="#list-waterfall"
|
|
||||||
role="tab"
|
|
||||||
aria-controls="list-waterfall"
|
|
||||||
v-bind:class="{
|
|
||||||
active: settings.local.spectrum === 'waterfall',
|
|
||||||
}"
|
|
||||||
@click="selectStatsControl($event)"
|
|
||||||
><strong><i class="bi bi-water"></i></strong
|
|
||||||
></a>
|
|
||||||
<a
|
|
||||||
class="py-0 list-group-item list-group-item-dark list-group-item-action"
|
|
||||||
id="list-scatter-list"
|
|
||||||
data-bs-toggle="list"
|
|
||||||
href="#list-scatter"
|
|
||||||
role="tab"
|
|
||||||
aria-controls="list-scatter"
|
|
||||||
v-bind:class="{
|
|
||||||
active: settings.local.spectrum === 'scatter',
|
|
||||||
}"
|
|
||||||
@click="selectStatsControl($event)"
|
|
||||||
><strong><i class="bi bi-border-outer"></i></strong
|
|
||||||
></a>
|
|
||||||
<a
|
|
||||||
class="py-0 list-group-item list-group-item-dark list-group-item-action"
|
|
||||||
id="list-chart-list"
|
|
||||||
data-bs-toggle="list"
|
|
||||||
href="#list-chart"
|
|
||||||
role="tab"
|
|
||||||
aria-controls="list-chart"
|
|
||||||
v-bind:class="{ active: settings.local.spectrum === 'chart' }"
|
|
||||||
@click="selectStatsControl($event)"
|
|
||||||
><strong><i class="bi bi-graph-up-arrow"></i></strong
|
|
||||||
></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="btn-group" role="group" aria-label="Busy indicators">
|
|
||||||
<button
|
|
||||||
class="btn btn-sm ms-1 p-1 disabled"
|
|
||||||
type="button"
|
|
||||||
data-bs-placement="top"
|
|
||||||
data-bs-toggle="tooltip"
|
|
||||||
data-bs-trigger="hover"
|
|
||||||
data-bs-html="true"
|
|
||||||
v-bind:class="{
|
|
||||||
'btn-warning': state.channel_busy_slot[0] === true,
|
|
||||||
'btn-outline-secondary': state.channel_busy_slot[0] === false,
|
|
||||||
}"
|
|
||||||
title="Channel busy state: <strong class='text-success'>not busy</strong> / <strong class='text-danger'>busy </strong>"
|
|
||||||
>
|
|
||||||
S1
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button
|
|
||||||
class="btn btn-sm p-1 disabled"
|
|
||||||
type="button"
|
|
||||||
data-bs-placement="top"
|
|
||||||
data-bs-toggle="tooltip"
|
|
||||||
data-bs-trigger="hover"
|
|
||||||
data-bs-html="true"
|
|
||||||
v-bind:class="{
|
|
||||||
'btn-warning': state.channel_busy_slot[1] === true,
|
|
||||||
'btn-outline-secondary': state.channel_busy_slot[1] === false,
|
|
||||||
}"
|
|
||||||
title="Channel busy state: <strong class='text-success'>not busy</strong> / <strong class='text-danger'>busy </strong>"
|
|
||||||
>
|
|
||||||
S2
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button
|
|
||||||
class="btn btn-sm p-1 disabled"
|
|
||||||
type="button"
|
|
||||||
data-bs-placement="top"
|
|
||||||
data-bs-toggle="tooltip"
|
|
||||||
data-bs-trigger="hover"
|
|
||||||
data-bs-html="true"
|
|
||||||
v-bind:class="{
|
|
||||||
'btn-warning': state.channel_busy_slot[2] === true,
|
|
||||||
'btn-outline-secondary': state.channel_busy_slot[2] === false,
|
|
||||||
}"
|
|
||||||
title="Channel busy state: <strong class='text-success'>not busy</strong> / <strong class='text-danger'>busy </strong>"
|
|
||||||
>
|
|
||||||
S3
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button
|
|
||||||
class="btn btn-sm p-1 disabled"
|
|
||||||
type="button"
|
|
||||||
data-bs-placement="top"
|
|
||||||
data-bs-toggle="tooltip"
|
|
||||||
data-bs-trigger="hover"
|
|
||||||
data-bs-html="true"
|
|
||||||
v-bind:class="{
|
|
||||||
'btn-warning': state.channel_busy_slot[3] === true,
|
|
||||||
'btn-outline-secondary': state.channel_busy_slot[3] === false,
|
|
||||||
}"
|
|
||||||
title="Channel busy state: <strong class='text-success'>not busy</strong> / <strong class='text-danger'>busy </strong>"
|
|
||||||
>
|
|
||||||
S4
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button
|
|
||||||
class="btn btn-sm p-1 disabled"
|
|
||||||
type="button"
|
|
||||||
data-bs-placement="top"
|
|
||||||
data-bs-toggle="tooltip"
|
|
||||||
data-bs-trigger="hover"
|
|
||||||
data-bs-html="true"
|
|
||||||
v-bind:class="{
|
|
||||||
'btn-warning': state.channel_busy_slot[4] === true,
|
|
||||||
'btn-outline-secondary': state.channel_busy_slot[4] === false,
|
|
||||||
}"
|
|
||||||
title="Channel busy state: <strong class='text-success'>not busy</strong> / <strong class='text-danger'>busy </strong>"
|
|
||||||
>
|
|
||||||
S5
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button
|
|
||||||
class="btn btn-sm p-1 disabled"
|
|
||||||
type="button"
|
|
||||||
data-bs-placement="top"
|
|
||||||
data-bs-toggle="tooltip"
|
|
||||||
data-bs-trigger="hover"
|
|
||||||
data-bs-html="true"
|
|
||||||
title="Recieving data: illuminates <strong class='text-success'>green</strong> if receiving codec2 data"
|
|
||||||
v-bind:class="{
|
|
||||||
'btn-success': state.is_codec2_traffic === true,
|
|
||||||
'btn-outline-secondary': state.is_codec2_traffic === false,
|
|
||||||
}"
|
|
||||||
>
|
|
||||||
data
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-1 text-end">
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
id="openHelpModalWaterfall"
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#waterfallHelpModal"
|
|
||||||
class="btn m-0 p-0 border-0"
|
|
||||||
>
|
|
||||||
<i class="bi bi-question-circle" style="font-size: 1rem"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-1">
|
|
||||||
<div class="tab-content" id="nav-stats-tabContent">
|
|
||||||
<div
|
|
||||||
class="tab-pane fade"
|
|
||||||
v-bind:class="{
|
|
||||||
'show active': settings.local.spectrum === 'waterfall',
|
|
||||||
}"
|
|
||||||
id="list-waterfall"
|
|
||||||
role="stats_tabpanel"
|
|
||||||
aria-labelledby="list-waterfall-list"
|
|
||||||
>
|
|
||||||
<canvas
|
|
||||||
ref="waterfall-main"
|
|
||||||
id="waterfall-main"
|
|
||||||
style="
|
|
||||||
position: relative;
|
|
||||||
z-index: 2;
|
|
||||||
aspect-ratio: unset;
|
|
||||||
width: 100%;
|
|
||||||
height: 200px;
|
|
||||||
"
|
|
||||||
class="force-gpu'"
|
|
||||||
></canvas>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="tab-pane fade"
|
|
||||||
v-bind:class="{
|
|
||||||
'show active': settings.local.spectrum === 'scatter',
|
|
||||||
}"
|
|
||||||
id="list-scatter"
|
|
||||||
role="tabpanel"
|
|
||||||
aria-labelledby="list-scatter-list"
|
|
||||||
>
|
|
||||||
<Scatter :data="scatterChartData" :options="scatterChartOptions" />
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="tab-pane fade"
|
|
||||||
v-bind:class="{ 'show active': settings.local.spectrum === 'chart' }"
|
|
||||||
id="list-chart"
|
|
||||||
role="tabpanel"
|
|
||||||
aria-labelledby="list-chart-list"
|
|
||||||
>
|
|
||||||
<Line
|
|
||||||
:data="transmissionSpeedChartData"
|
|
||||||
:options="transmissionSpeedChartOptions"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!--278px-->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
|
@ -1,62 +0,0 @@
|
||||||
<script setup>
|
|
||||||
import { setActivePinia } from "pinia";
|
|
||||||
import pinia from "../store/index";
|
|
||||||
setActivePinia(pinia);
|
|
||||||
|
|
||||||
import { useAudioStore } from "../store/audioStore.js";
|
|
||||||
const audio = useAudioStore(pinia);
|
|
||||||
|
|
||||||
import { setConfig } from "../js/api";
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="card mb-0">
|
|
||||||
<div class="card-header p-1">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-1">
|
|
||||||
<i class="bi bi-volume-up" style="font-size: 1.2rem"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-10">
|
|
||||||
<strong class="fs-5">Audio devices</strong>
|
|
||||||
</div>
|
|
||||||
<div class="col-1 text-end">
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#audioHelpModal"
|
|
||||||
class="btn m-0 p-0 border-0"
|
|
||||||
>
|
|
||||||
<i class="bi bi-question-circle" style="font-size: 1rem"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card-body p-2" style="height: 100px">
|
|
||||||
<div class="input-group input-group-sm mb-1">
|
|
||||||
<span class="input-group-text">
|
|
||||||
<i class="bi bi-mic-fill" style="font-size: 1rem"></i>
|
|
||||||
</span>
|
|
||||||
<select
|
|
||||||
class="form-select form-select-sm"
|
|
||||||
aria-label=".form-select-sm"
|
|
||||||
v-html="audio.getInputDevices()"
|
|
||||||
@change="setConfig"
|
|
||||||
></select>
|
|
||||||
</div>
|
|
||||||
<div class="input-group input-group-sm">
|
|
||||||
<span class="input-group-text">
|
|
||||||
<i class="bi bi-volume-up" style="font-size: 1rem"></i>
|
|
||||||
</span>
|
|
||||||
<select
|
|
||||||
class="form-select form-select-sm"
|
|
||||||
aria-label=".form-select-sm"
|
|
||||||
v-html="audio.getOutputDevices()"
|
|
||||||
@change="setConfig"
|
|
||||||
></select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
|
@ -1,114 +0,0 @@
|
||||||
<script setup lang="ts">
|
|
||||||
import { setActivePinia } from "pinia";
|
|
||||||
import pinia from "../store/index";
|
|
||||||
setActivePinia(pinia);
|
|
||||||
|
|
||||||
import { settingsStore as settings } from "../store/settingsStore.js";
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="card mb-1">
|
|
||||||
<div class="card-header p-1">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-1">
|
|
||||||
<i class="bi bi-house-door" style="font-size: 1.2rem"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-10">
|
|
||||||
<strong class="fs-5">My station</strong>
|
|
||||||
</div>
|
|
||||||
<div class="col-1 text-end">
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
id="openHelpModalStation"
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#stationHelpModal"
|
|
||||||
class="btn m-0 p-0 border-0"
|
|
||||||
>
|
|
||||||
<i class="bi bi-question-circle" style="font-size: 1rem"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-auto">
|
|
||||||
<div
|
|
||||||
class="input-group input-group-sm mb-0"
|
|
||||||
data-bs-placement="bottom"
|
|
||||||
data-bs-toggle="tooltip"
|
|
||||||
data-bs-trigger="hover"
|
|
||||||
data-bs-html="false"
|
|
||||||
title="Enter your callsign and save it"
|
|
||||||
>
|
|
||||||
<span class="input-group-text">
|
|
||||||
<i class="bi bi-person-bounding-box" style="font-size: 1rem"></i>
|
|
||||||
</span>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
class="form-control"
|
|
||||||
style="width: 5rem; text-transform: uppercase"
|
|
||||||
placeholder="callsign"
|
|
||||||
pattern="[A-Z]*"
|
|
||||||
id="myCall"
|
|
||||||
maxlength="8"
|
|
||||||
aria-label="Input group"
|
|
||||||
aria-describedby="btnGroupAddon"
|
|
||||||
v-model="settings.remote.STATION.mycall"
|
|
||||||
/>
|
|
||||||
<select
|
|
||||||
class="form-select form-select-sm"
|
|
||||||
aria-label=".form-select-sm"
|
|
||||||
id="myCallSSID"
|
|
||||||
v-model="settings.remote.STATION.myssid"
|
|
||||||
>
|
|
||||||
<option selected value="0">0</option>
|
|
||||||
<option value="1">1</option>
|
|
||||||
<option value="2">2</option>
|
|
||||||
<option value="3">3</option>
|
|
||||||
<option value="4">4</option>
|
|
||||||
<option value="5">5</option>
|
|
||||||
<option value="6">6</option>
|
|
||||||
<option value="7">7</option>
|
|
||||||
<option value="8">8</option>
|
|
||||||
<option value="9">9</option>
|
|
||||||
<option value="10">10</option>
|
|
||||||
<option value="11">11</option>
|
|
||||||
<option value="12">12</option>
|
|
||||||
<option value="13">13</option>
|
|
||||||
<option value="14">14</option>
|
|
||||||
<option value="15">15</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-auto">
|
|
||||||
<div
|
|
||||||
class="input-group input-group-sm mb-0"
|
|
||||||
data-bs-placement="bottom"
|
|
||||||
data-bs-toggle="tooltip"
|
|
||||||
data-bs-trigger="hover"
|
|
||||||
data-bs-html="false"
|
|
||||||
title="Enter your gridsquare and save it"
|
|
||||||
>
|
|
||||||
<span class="input-group-text">
|
|
||||||
<i class="bi bi-house-fill" style="font-size: 1rem"></i>
|
|
||||||
</span>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
class="form-control mr-1"
|
|
||||||
style="max-width: 6rem"
|
|
||||||
placeholder="locator"
|
|
||||||
id="myGrid"
|
|
||||||
maxlength="6"
|
|
||||||
aria-label="Input group"
|
|
||||||
aria-describedby="btnGroupAddon"
|
|
||||||
v-model="settings.remote.STATION.mygrid"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- end of row-->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
|
@ -1,235 +0,0 @@
|
||||||
<script setup lang="ts">
|
|
||||||
import { setActivePinia } from "pinia";
|
|
||||||
import pinia from "../store/index";
|
|
||||||
setActivePinia(pinia);
|
|
||||||
|
|
||||||
import { settingsStore as settings } from "../store/settingsStore.js";
|
|
||||||
|
|
||||||
import { useStateStore } from "../store/stateStore.js";
|
|
||||||
const state = useStateStore(pinia);
|
|
||||||
|
|
||||||
function selectRadioControl() {
|
|
||||||
// @ts-expect-error
|
|
||||||
switch (event.target.id) {
|
|
||||||
case "list-rig-control-none-list":
|
|
||||||
settings.remote.RADIO.control = "disabled";
|
|
||||||
break;
|
|
||||||
case "list-rig-control-rigctld-list":
|
|
||||||
settings.remote.RADIO.control = "rigctld";
|
|
||||||
break;
|
|
||||||
case "list-rig-control-rigctld-list":
|
|
||||||
settings.remote.RADIO.control = "rigctld_bundle";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "list-rig-control-tci-list":
|
|
||||||
settings.remote.RADIO.control = "tci";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
console.log("default=!==");
|
|
||||||
settings.remote.RADIO.control = "disabled";
|
|
||||||
}
|
|
||||||
//saveSettingsToFile();
|
|
||||||
}
|
|
||||||
|
|
||||||
function testHamlib() {
|
|
||||||
console.log("not yet implemented");
|
|
||||||
alert("not yet implemented");
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="mb-3">
|
|
||||||
<div class="card mb-1">
|
|
||||||
<div class="card-header p-1">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-1">
|
|
||||||
<i class="bi bi-projector" style="font-size: 1.2rem"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-4">
|
|
||||||
<strong class="fs-5">Rig control</strong>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-6">
|
|
||||||
<div
|
|
||||||
class="list-group bg-body-tertiary list-group-horizontal w-75"
|
|
||||||
id="rig-control-list-tab"
|
|
||||||
role="rig-control-tablist"
|
|
||||||
>
|
|
||||||
<a
|
|
||||||
class="p-1 list-group-item list-group-item-dark list-group-item-action"
|
|
||||||
id="list-rig-control-none-list"
|
|
||||||
data-bs-toggle="list"
|
|
||||||
href="#list-rig-control-none"
|
|
||||||
role="tab"
|
|
||||||
aria-controls="list-rig-control-none"
|
|
||||||
v-bind:class="{
|
|
||||||
active: settings.remote.RADIO.control === 'disabled',
|
|
||||||
}"
|
|
||||||
@click="selectRadioControl()"
|
|
||||||
>None</a
|
|
||||||
>
|
|
||||||
<a
|
|
||||||
class="p-1 list-group-item list-group-item-dark list-group-item-action"
|
|
||||||
id="list-rig-control-rigctld-list"
|
|
||||||
data-bs-toggle="list"
|
|
||||||
href="#list-rig-control-rigctld"
|
|
||||||
role="tab"
|
|
||||||
aria-controls="list-rig-control-rigctld"
|
|
||||||
v-bind:class="{
|
|
||||||
active: settings.remote.RADIO.control === 'rigctld',
|
|
||||||
}"
|
|
||||||
@click="selectRadioControl()"
|
|
||||||
>Rigctld</a
|
|
||||||
>
|
|
||||||
<a
|
|
||||||
class="p-1 list-group-item list-group-item-dark list-group-item-action"
|
|
||||||
id="list-rig-control-tci-list"
|
|
||||||
data-bs-toggle="list"
|
|
||||||
href="#list-rig-control-tci"
|
|
||||||
role="tab"
|
|
||||||
aria-controls="list-rig-control-tci"
|
|
||||||
v-bind:class="{
|
|
||||||
active: settings.remote.RADIO.control === 'tci',
|
|
||||||
}"
|
|
||||||
@click="selectRadioControl()"
|
|
||||||
>TCI</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-1 text-end">
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
id="openHelpModalRigControl"
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#rigcontrolHelpModal"
|
|
||||||
class="btn m-0 p-0 border-0"
|
|
||||||
>
|
|
||||||
<i class="bi bi-question-circle" style="font-size: 1rem"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2" style="height: 100px">
|
|
||||||
<div class="tab-content" id="rig-control-nav-tabContent">
|
|
||||||
<div
|
|
||||||
class="tab-pane fade"
|
|
||||||
v-bind:class="{
|
|
||||||
'show active': settings.remote.RADIO.control === 'disabled',
|
|
||||||
}"
|
|
||||||
id="list-rig-control-none"
|
|
||||||
role="tabpanel"
|
|
||||||
aria-labelledby="list-rig-control-none-list"
|
|
||||||
>
|
|
||||||
<p class="small">
|
|
||||||
Modem will not utilize rig control and features will be limited.
|
|
||||||
While functional; it is recommended to configure hamlib. <br />
|
|
||||||
Use this setting also for <strong> VOX </strong>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="tab-pane fade"
|
|
||||||
id="list-rig-control-rigctld"
|
|
||||||
v-bind:class="{
|
|
||||||
'show active': settings.remote.RADIO.control === 'rigctld',
|
|
||||||
}"
|
|
||||||
role="tabpanel"
|
|
||||||
aria-labelledby="list-rig-control-rigctld-list"
|
|
||||||
>
|
|
||||||
<div class="input-group input-group-sm mb-1">
|
|
||||||
<div class="input-group input-group-sm mb-1">
|
|
||||||
<span class="input-group-text">Rigctld service</span>
|
|
||||||
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
class="form-control"
|
|
||||||
placeholder="Status"
|
|
||||||
id="hamlib_rigctld_status"
|
|
||||||
aria-label="State"
|
|
||||||
aria-describedby="basic-addon1"
|
|
||||||
v-model="state.rigctld_started"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
id="testHamlib"
|
|
||||||
class="btn btn-sm btn-outline-secondary ms-1"
|
|
||||||
data-bs-placement="bottom"
|
|
||||||
data-bs-toggle="tooltip"
|
|
||||||
data-bs-trigger="hover"
|
|
||||||
data-bs-html="true"
|
|
||||||
@click="testHamlib"
|
|
||||||
title="Test your hamlib settings and toggle PTT once. Button will become <strong class='text-success'>green</strong> on success and <strong class='text-danger'>red</strong> if fails."
|
|
||||||
>
|
|
||||||
PTT Test
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="tab-pane fade"
|
|
||||||
id="list-rig-control-tci"
|
|
||||||
v-bind:class="{
|
|
||||||
'show active': settings.remote.RADIO.control === 'tci',
|
|
||||||
}"
|
|
||||||
role="tabpanel"
|
|
||||||
aria-labelledby="list-rig-control-tci-list"
|
|
||||||
>
|
|
||||||
<div class="input-group input-group-sm mb-1">
|
|
||||||
<div class="input-group input-group-sm mb-1">
|
|
||||||
<span class="input-group-text">TCI</span>
|
|
||||||
<span class="input-group-text">Address</span>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
class="form-control"
|
|
||||||
placeholder="tci IP"
|
|
||||||
id="tci_ip"
|
|
||||||
aria-label="Device IP"
|
|
||||||
v-model="settings.remote.TCI.tci_ip"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="input-group input-group-sm mb-1">
|
|
||||||
<span class="input-group-text">Port</span>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
class="form-control"
|
|
||||||
placeholder="tci port"
|
|
||||||
id="tci_port"
|
|
||||||
aria-label="Device Port"
|
|
||||||
v-model="settings.remote.TCI.tci_port"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- RADIO CONTROL DISABLED -->
|
|
||||||
<div id="radio-control-disabled"></div>
|
|
||||||
|
|
||||||
<!-- RADIO CONTROL RIGCTLD -->
|
|
||||||
<div id="radio-control-rigctld"></div>
|
|
||||||
<!-- RADIO CONTROL TCI-->
|
|
||||||
<div id="radio-control-tci"></div>
|
|
||||||
<!-- RADIO CONTROL HELP -->
|
|
||||||
<div id="radio-control-help">
|
|
||||||
<!--
|
|
||||||
<strong>VOX:</strong> Use rig control mode 'none'
|
|
||||||
<br />
|
|
||||||
<strong>HAMLIB locally:</strong> configure in settings, then
|
|
||||||
start/stop service.
|
|
||||||
<br />
|
|
||||||
<strong>HAMLIB remotely:</strong> Enter IP/Port, connection
|
|
||||||
happens automatically.
|
|
||||||
-->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!--<div class="card-footer text-muted small" id="hamlib_info_field">
|
|
||||||
Define Modem rig control mode (none/hamlib)
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
|
@ -164,36 +164,6 @@ const audioStore = useAudioStore();
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="input-group input-group-sm mb-1">
|
|
||||||
<label class="input-group-text w-25">Tuning range</label>
|
|
||||||
<label class="input-group-text">fmin</label>
|
|
||||||
<select
|
|
||||||
class="form-select form-select-sm"
|
|
||||||
id="tuning_range_fmin"
|
|
||||||
@change="onChange"
|
|
||||||
v-model.number="settings.remote.MODEM.tuning_range_fmin"
|
|
||||||
>
|
|
||||||
<option value="-50">-50</option>
|
|
||||||
<option value="-100">-100</option>
|
|
||||||
<option value="-150">-150</option>
|
|
||||||
<option value="-200">-200</option>
|
|
||||||
<option value="-250">-250</option>
|
|
||||||
</select>
|
|
||||||
<label class="input-group-text">fmax</label>
|
|
||||||
<select
|
|
||||||
class="form-select form-select-sm"
|
|
||||||
id="tuning_range_fmax"
|
|
||||||
@change="onChange"
|
|
||||||
v-model.number="settings.remote.MODEM.tuning_range_fmax"
|
|
||||||
>
|
|
||||||
<option value="50">50</option>
|
|
||||||
<option value="100">100</option>
|
|
||||||
<option value="150">150</option>
|
|
||||||
<option value="200">200</option>
|
|
||||||
<option value="250">250</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="input-group input-group-sm mb-1">
|
<div class="input-group input-group-sm mb-1">
|
||||||
<label class="input-group-text w-50">Enable 250Hz bandwidth mode</label>
|
<label class="input-group-text w-50">Enable 250Hz bandwidth mode</label>
|
||||||
<label class="input-group-text w-50">
|
<label class="input-group-text w-50">
|
||||||
|
@ -224,27 +194,4 @@ const audioStore = useAudioStore();
|
||||||
</div>
|
</div>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="input-group input-group-sm mb-1">
|
|
||||||
<label class="input-group-text w-50">RX buffer size</label>
|
|
||||||
<label class="input-group-text w-50">
|
|
||||||
<select
|
|
||||||
class="form-select form-select-sm"
|
|
||||||
id="rx_buffer_size"
|
|
||||||
@change="onChange"
|
|
||||||
v-model.number="settings.remote.MODEM.rx_buffer_size"
|
|
||||||
>
|
|
||||||
<option value="1">1</option>
|
|
||||||
<option value="2">2</option>
|
|
||||||
<option value="4">4</option>
|
|
||||||
<option value="8">8</option>
|
|
||||||
<option value="16">16</option>
|
|
||||||
<option value="32">32</option>
|
|
||||||
<option value="64">64</option>
|
|
||||||
<option value="128">128</option>
|
|
||||||
<option value="256">256</option>
|
|
||||||
<option value="512">512</option>
|
|
||||||
<option value="1024">1024</option>
|
|
||||||
</select>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -54,12 +54,8 @@ const defaultConfig = {
|
||||||
enable_protocol: false,
|
enable_protocol: false,
|
||||||
},
|
},
|
||||||
MODEM: {
|
MODEM: {
|
||||||
enable_fsk: false,
|
|
||||||
enable_low_bandwidth_mode: false,
|
enable_low_bandwidth_mode: false,
|
||||||
respond_to_cq: false,
|
respond_to_cq: false,
|
||||||
rx_buffer_size: 0,
|
|
||||||
tuning_range_fmax: 0,
|
|
||||||
tuning_range_fmin: 0,
|
|
||||||
tx_delay: 0,
|
tx_delay: 0,
|
||||||
enable_hamc: false,
|
enable_hamc: false,
|
||||||
enable_morse_identifier: false,
|
enable_morse_identifier: false,
|
||||||
|
|
|
@ -46,13 +46,9 @@ enable_protocol = False
|
||||||
|
|
||||||
[MODEM]
|
[MODEM]
|
||||||
enable_hmac = False
|
enable_hmac = False
|
||||||
tuning_range_fmax = 50
|
|
||||||
tuning_range_fmin = -50
|
|
||||||
enable_fsk = False
|
|
||||||
enable_low_bandwidth_mode = False
|
enable_low_bandwidth_mode = False
|
||||||
enable_morse_identifier = False
|
enable_morse_identifier = False
|
||||||
respond_to_cq = True
|
respond_to_cq = True
|
||||||
rx_buffer_size = 64
|
|
||||||
tx_delay = 200
|
tx_delay = 200
|
||||||
|
|
||||||
[MESSAGES]
|
[MESSAGES]
|
||||||
|
|
|
@ -56,14 +56,10 @@ class CONFIG:
|
||||||
'enable_protocol': bool,
|
'enable_protocol': bool,
|
||||||
},
|
},
|
||||||
'MODEM': {
|
'MODEM': {
|
||||||
'tuning_range_fmax': int,
|
|
||||||
'tuning_range_fmin': int,
|
|
||||||
'enable_fsk': bool,
|
|
||||||
'enable_hmac': bool,
|
'enable_hmac': bool,
|
||||||
'enable_morse_identifier': bool,
|
'enable_morse_identifier': bool,
|
||||||
'enable_low_bandwidth_mode': bool,
|
'enable_low_bandwidth_mode': bool,
|
||||||
'respond_to_cq': bool,
|
'respond_to_cq': bool,
|
||||||
'rx_buffer_size': int,
|
|
||||||
'tx_delay': int
|
'tx_delay': int
|
||||||
},
|
},
|
||||||
'MESSAGES': {
|
'MESSAGES': {
|
||||||
|
|
|
@ -30,8 +30,6 @@ class Demodulator():
|
||||||
def __init__(self, config, audio_rx_q, modem_rx_q, data_q_rx, states, event_manager, fft_queue):
|
def __init__(self, config, audio_rx_q, modem_rx_q, data_q_rx, states, event_manager, fft_queue):
|
||||||
self.log = structlog.get_logger("Demodulator")
|
self.log = structlog.get_logger("Demodulator")
|
||||||
|
|
||||||
self.tuning_range_fmin = config['MODEM']['tuning_range_fmin']
|
|
||||||
self.tuning_range_fmax = config['MODEM']['tuning_range_fmax']
|
|
||||||
self.rx_audio_level = config['AUDIO']['rx_audio_level']
|
self.rx_audio_level = config['AUDIO']['rx_audio_level']
|
||||||
|
|
||||||
self.AUDIO_FRAMES_PER_BUFFER_RX = 4800
|
self.AUDIO_FRAMES_PER_BUFFER_RX = 4800
|
||||||
|
@ -79,13 +77,6 @@ class Demodulator():
|
||||||
codec2.api.freedv_open(mode), ctypes.c_void_p
|
codec2.api.freedv_open(mode), ctypes.c_void_p
|
||||||
)
|
)
|
||||||
|
|
||||||
# set tuning range
|
|
||||||
codec2.api.freedv_set_tuning_range(
|
|
||||||
c2instance,
|
|
||||||
ctypes.c_float(float(self.tuning_range_fmin)),
|
|
||||||
ctypes.c_float(float(self.tuning_range_fmax)),
|
|
||||||
)
|
|
||||||
|
|
||||||
# get bytes per frame
|
# get bytes per frame
|
||||||
bytes_per_frame = int(
|
bytes_per_frame = int(
|
||||||
codec2.api.freedv_get_bits_per_modem_frame(c2instance) / 8
|
codec2.api.freedv_get_bits_per_modem_frame(c2instance) / 8
|
||||||
|
|
|
@ -353,7 +353,7 @@ if __name__ == "__main__":
|
||||||
modemport = conf['NETWORK']['modemport']
|
modemport = conf['NETWORK']['modemport']
|
||||||
|
|
||||||
if not modemaddress:
|
if not modemaddress:
|
||||||
modemaddress = '127.0.0.1'
|
modemaddress = '0.0.0.0'
|
||||||
if not modemport:
|
if not modemport:
|
||||||
modemport = 5000
|
modemport = 5000
|
||||||
app.run(modemaddress, modemport)
|
app.run(modemaddress, modemport)
|
||||||
|
|
Loading…
Reference in a new issue