1. 显示主机当前状态
2. 可发送自定义波形
This commit is contained in:
Fang_Zhijian 2024-05-12 21:10:24 +08:00
parent 164dcc6ac5
commit cc552fcbee
6 changed files with 122 additions and 28 deletions

View File

@ -36,6 +36,10 @@ button {
-o-border-radius: 3px;
}
a {
color: #fce9a7;
}
button:hover {
background-color: #ffe668;
}
@ -450,6 +454,18 @@ select {
position: fixed;
}
.game-info {
position: fixed;
top: 64px;
right: 60px;
padding: 0 10px 10px 10px;
color: #ffe99d;
background: #171717;
border-radius: 10px;
border: 1px solid #ffe99d;
width: 200px;
}
.tips-hide {
font-weight: bold;
margin-left: 15px;

BIN
public/img/31036.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
public/img/31039.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -3,20 +3,26 @@
// Check out https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup
import { ref } from "vue"
import axios from "axios"
import { Notyf } from 'notyf'
import { createSocket, destroySocket } from "./socket/index"
import {
createCoyoteSocket,
closeCoyoteSocket,
addOrIncrease,
sendWaveData,
qrcodeSrc,
qrcodeShow,
addOrIncrease
channelAStrength,
channelBStrength,
softAStrength,
softBStrength,
followAStrength,
followBStrength
} from "./socket/coyote"
import { Notyf } from 'notyf'
const notyf = new Notyf({ duration: 3000 })
// API
const api = axios.create({
baseURL: "http://localhost:3000",
@ -35,6 +41,8 @@ const wssLinks = ref([])
const heartBeatTimer = ref<NodeJS.Timer>()
// be ready
clearInterval(heartBeatTimer.value!)
//
const waveData = ref("")
/**
* 测试请求鉴权接口
@ -158,11 +166,10 @@ const handleDestroySocket = () => {
* 测试按钮
*/
const test = () => {
const waveData = {
"test": `["0A0A0A0A00000000","0A0A0A0A00000000","0A0A0A0A00000000","0A0A0A0A00000000","0A0A0A0A00000000","0A0A0A0A00000000","0A0A0A0A00000000","0A0A0A0A00000000","0A0A0A0A01010101","0A0A0A0A01010101","0A0A0A0A22222222","0A0A0A0A22222222","0A0A0A0A43434343","0A0A0A0A43434343","0A0A0A0A64646464","0A0A0A0A64646464"]`
}
try {
sendWaveData(5, 5, waveData["test"], waveData["test"])
sendWaveData(5, 5, waveData.value, waveData.value)
addOrIncrease(2, 1, 1)
console.log(waveData.value)
notyf.success("波形发送成功")
}
catch (e) {
@ -202,8 +209,26 @@ const hideqrcode = () => {
<div class="game-tips">
! 请在连接前确保已经设置好强度上限
</div>
<div>
<div class="game-info">
<h2>主机状态</h2>
<p>A: {{ channelAStrength }} / {{ softAStrength }}</p>
<p>B: {{ channelBStrength }} / {{ softBStrength }}</p>
<hr />
<h2>游戏设置</h2>
<p>强度跟随 <u title="开启后对应强度将自动跟随软上限变化">?</u></p>
A<input type="checkbox" v-model="followAStrength" />
B<input type="checkbox" v-model="followBStrength" />
<hr />
<h2>游戏玩法</h2>
<p><img src="/img/31036.png" width="18" alt="小花花">强度 -1</p>
<p><img src="/img/31039.png" width="18" alt="牛哇牛哇">强度 +1</p>
</div>
<div>
<h2>系统设置</h2>
<div class="form">
<label>主播身份码</label>
<input type="password" placeholder="填写主播身份码" v-model="codeId"/>
@ -220,6 +245,8 @@ const hideqrcode = () => {
<h2>调试选项</h2>
<div class="form">
<button @click="getAuth">鉴权</button>
<label>波形数组 <a onclick="window.open('waveHelper.html', '', 'width=500,height=1000,left=700');">波形助手</a></label>
<input type="text" placeholder="填写欲测试的波形数组" v-model="waveData" />
<button @click="test">测试</button>
</div>
</div>

View File

@ -4,15 +4,17 @@ import QRCode from 'qrcode'
const notyf = new Notyf({ duration: 4000 })
let channelAStrength = 0; // A通道强度
let channelBStrength = 0; // B通道强度
let channelAStrength = ref(0); // A通道强度
let channelBStrength = ref(0); // B通道强度
let softAStrength = ref(0); // A通道软上限
let softBStrength = ref(0); // B通道软上限
let followAStrength = ref(false); //跟随A通道软上限
let followBStrength = ref(false); //跟随B通道软上限
let connectionId = ""; // 从接口获取的连接标识符
let targetWSId = ""; // 发送目标
let fangdou = 500; //500毫秒防抖
let fangdouSetTimeOut; // 防抖定时器
let followAStrength = false; //跟随AB软上限
let followBStrength = false;
let wsConn; // 全局ws链接
const feedBackMsg = {
"feedback-0": "A通道○",
@ -36,8 +38,9 @@ QRCode.toDataURL("https://www.dungeon-lab.com/app-download.php#DGLAB-SOCKET#wss:
function createCoyoteSocket() {
wsConn = new WebSocket('wss://coyote.babyfang.cn/');
wsConn.onopen = function (event) {
console.log("WebSocket连接已建立");
console.log("WebSocket连接已建立")
}
wsConn.onmessage = function (event) {
@ -46,7 +49,7 @@ function createCoyoteSocket() {
msg = JSON.parse(event.data);
} catch (e) {
console.log(event.data);
return;
return
}
console.log(event.data)
@ -64,36 +67,71 @@ function createCoyoteSocket() {
} else {
if (msg.clientId != connectionId) {
console.log("错误的clientId")
return;
return
}
targetWSId = msg.targetId;
console.log("收到targetId: " + msg.targetId + ", msg: " + msg.message);
qrcodeShow.value = false
notyf.success({message: "郊狼连接成功"})
}
break;
break
case 'break':
if (msg.targetId != targetWSId)
return;
return
console.log("收到断开连接指令")
notyf.error({ message: "收到断开连接指令" })
//location.reload();
break;
break
case 'error':
if (msg.targetId != targetWSId)
return;
return
console.log("对方已断开code" + msg.message)
notyf.error({ message: "对方已断开(" + msg.message + "" })
break;
break
case 'msg':
const result: { type: string; numbers: number[] }[] = []
if(msg.message.includes("strength")) {
const numbers = msg.message.match(/\d+/g).map(Number)
result.push({ type: "strength", numbers: numbers })
}
console.log(numbers)
channelAStrength.value = numbers[0];
channelBStrength.value = numbers[1];
softAStrength.value = numbers[2];
softBStrength.value = numbers[3];
if (followAStrength.value && numbers[2] !== numbers[0]) {
const data1 = { type: 4, message: `strength-1+2+${numbers[2]}` }
sendWsMsg(data1)
}
if (followBStrength.value && numbers[3] !== numbers[1]) {
const data2 = { type: 4, message: `strength-2+2+${numbers[3]}` }
sendWsMsg(data2)
}
} else if (msg.message.includes("feedback")) {
notyf.success({ message: feedBackMsg[msg.message] })
}
break
case 'heartbeat':
console.log("收到心跳包")
break
default:
console.log("未知消息类型:" + JSON.stringify(msg));
break
}
}
wsConn.onerror = function (event) {
console.log("WebSocket连接出错")
notyf.error({ message: "WebSocket连接出错" })
}
wsConn.onclose = function (event) {
console.log("WebSocket连接已关闭")
notyf.error({ message: "WebSocket连接已关闭" })
}
}
function sendWsMsg(messageObj) {
@ -108,7 +146,7 @@ function addOrIncrease(type, channelIndex, strength) {
// 1 减少一 2 增加一 3 设置到
// channel:1-A 2-B
// 获取当前频道元素和当前值
let channelStrength = channelIndex === 1 ? channelAStrength : channelBStrength;
let channelStrength = channelIndex === 1 ? channelAStrength.value : channelBStrength.value;
// 如果是设置操作
if (type === 3) {
@ -170,4 +208,19 @@ function closeCoyoteSocket() {
}
export { createCoyoteSocket, closeCoyoteSocket, sendWsMsg, sendWaveData, addOrIncrease, clearAB, qrcodeSrc, qrcodeShow, channelAStrength, channelBStrength }
export {
createCoyoteSocket,
closeCoyoteSocket,
sendWsMsg,
sendWaveData,
addOrIncrease,
clearAB,
qrcodeSrc,
qrcodeShow,
channelAStrength,
channelBStrength,
softAStrength,
softBStrength,
followAStrength,
followBStrength
}

View File

@ -13,7 +13,7 @@ const sliderGroups: Ref<SliderGroup[]> = ref([
reactive({ sliders: [50, 50, 50, 50], autoStrength: true }),
]);
const inputFrequency = ref(0)
const inputFrequency = ref(10)
const waveData = ref()
@ -152,7 +152,7 @@ function deleteGroup(index: number) {
<button @click="newGroup">新建分组</button>
<div v-if="waveData">
<h3>波形数据</h3>
<div style="overflow-x: scroll;">{{ JSON.stringify(waveData) }}</div>
<textarea style="width: 100%; height: 50px;">{{ JSON.stringify(waveData) }}</textarea>
</div>
</div>
</template>
@ -168,12 +168,10 @@ function deleteGroup(index: number) {
}
.slider {
writing-mode: bt-lr; /* IE */
-webkit-appearance: slider-vertical; /* WebKit */
-webkit-appearance: slider-vertical;
margin-top: 26px;
width: 8px;
height: 200px;
padding: 0 5px;
}
</style>