Allow arbitrary networktables address (#764)

* Allow specifying NT server address by ip.
This commit is contained in:
Doug Wegscheid
2023-05-12 18:01:09 -04:00
committed by GitHub
parent 6bdb158b33
commit 80f479344d
11 changed files with 73 additions and 26 deletions

View File

@@ -81,7 +81,7 @@
</v-list-item-title>
<router-link v-if="!$store.state.settings.networkSettings.runNTServer" to="settings" class="accent--text"
@click="switchToSettingsTab">
Team number is {{ $store.state.settings.networkSettings.teamNumber }}
NT server is {{ $store.state.settings.networkSettings.ntServerAddress }}
</router-link>
</v-list-item-content>
</v-list-item>
@@ -151,7 +151,7 @@ export default {
computed: {
needsTeamNumberSet: {
get() {
return this.$store.state.settings.networkSettings.teamNumber < 1
return this.$store.state.settings.networkSettings.ntServerAddress == ""
&& this.teamNumberDialog && this.$store.state.backendConnected
&& !this.$route.name.toLowerCase().includes("settings");
}

View File

@@ -135,7 +135,7 @@ export default new Vuex.Store({
hardwarePlatform: "Unknown",
},
networkSettings: {
teamNumber: 0,
ntServerAddress: "",
supported: true,
// Below options are only configurable if supported is true

View File

@@ -475,7 +475,7 @@ export default {
},
showNTWarning: {
get() {
return (!this.$store.state.ntConnectionInfo.connected || this.$store.state.settings.networkSettings.runNTServer) && this.$store.state.settings.networkSettings.teamNumber > 0 && this.$store.state.backendConnected && !this.hideNTWarning;
return (!this.$store.state.ntConnectionInfo.connected || this.$store.state.settings.networkSettings.runNTServer) && this.$store.state.settings.networkSettings.ntServerAddress != "" && this.$store.state.backendConnected && !this.hideNTWarning;
}
},
},

View File

@@ -4,21 +4,21 @@
ref="form"
v-model="valid"
>
<CVnumberinput
v-model="teamNumber"
<CVinput
v-model="ntServerAddress"
:input-cols="inputCols"
:disabled="settings.runNTServer"
name="Team Number"
:rules="[v => (v > 0) || 'Team number must be greater than zero', v => (v < 10000) || 'Team number must have fewer than five digits']"
class="mb-4"
:label-cols="$vuetify.breakpoint.mdAndUp ? undefined : 5"
tooltip="enter the team number or the IP address of the robot NetworkTables server"
:rules="[v => isValidTeamNumber(v) || 'Team Number must be non blank and a team number, IP address, or hostname']"
/>
<v-banner
v-show="(teamNumber < 1 || teamNumber > 10000) && !runNTServer"
v-show="!isValidTeamNumber(ntServerAddress) && !runNTServer"
rounded
color="red"
text-color="white"
>
Team number is unset or invalid. NetworkTables will not be able to connect.
Team Number unset or invalid. NetworkTables will not be able to connect.
</v-banner>
<CVradio
v-show="$store.state.settings.networkSettings.shouldManage"
@@ -36,6 +36,7 @@
name="IP"
/>
<CVinput
v-show="$store.state.settings.networkSettings.shouldManage"
v-model="hostname"
:input-cols="inputCols"
:rules="[v => isHostname(v) || 'Invalid hostname']"
@@ -165,7 +166,6 @@
</template>
<script>
import CVnumberinput from '../../components/common/cv-number-input'
import CVradio from '../../components/common/cv-radio'
import CVinput from '../../components/common/cv-input'
import CVSwitch from "@/components/common/cv-switch";
@@ -174,12 +174,13 @@ import CVSwitch from "@/components/common/cv-switch";
const ipv4Regex = /^((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])$/;
// https://stackoverflow.com/a/18494710
const hostnameRegex = /^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)+(\.([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*))*$/;
const teamNumberRegex = /^[1-9][0-9]{0,3}$/;
const badTeamNumberRegex = /^[0-9]{5,}$/;
export default {
name: 'Networking',
components: {
CVSwitch,
CVnumberinput,
CVradio,
CVinput
},
@@ -205,12 +206,12 @@ export default {
settings() {
return this.$store.state.settings.networkSettings;
},
teamNumber: {
ntServerAddress: {
get() {
return this.settings.teamNumber
return this.settings.ntServerAddress
},
set(value) {
this.$store.commit('mutateNetworkSettings', {['teamNumber']: value || 0});
this.$store.commit('mutateNetworkSettings', {['ntServerAddress']: value || ""});
}
},
runNTServer: {
@@ -247,6 +248,16 @@ export default {
},
},
methods: {
isValidTeamNumber(v) {
if (teamNumberRegex.test(v)) return true;
if (ipv4Regex.test(v)) return true;
// need to check these before the hostname. "0" and "99999" are valid hostnames,
// but we don't want to allow then
if (v == '0') return false;
if (badTeamNumberRegex.test(v)) return false;
if (hostnameRegex.test(v)) return true;
return false;
},
isIPv4(v) {
return ipv4Regex.test(v);
},