Compare commits

...

2 Commits

5 changed files with 3532 additions and 3419 deletions

View File

@ -11,6 +11,7 @@ static class CameraAddr
public const UInt32 STORE_NUM = BASE + 0x13; public const UInt32 STORE_NUM = BASE + 0x13;
public const UInt32 EXPECTED_VH = BASE + 0x14; public const UInt32 EXPECTED_VH = BASE + 0x14;
public const UInt32 CAPTURE_ON = BASE + 0x15; public const UInt32 CAPTURE_ON = BASE + 0x15;
public const UInt32 CAMERA_POWER = BASE + 0x16; //[0]: rstn, 0 is reset. [8]: power down, 1 is down.
} }
class Camera class Camera
@ -26,7 +27,7 @@ class Camera
const uint CAM_I2C_ADDR = 0x3C; const uint CAM_I2C_ADDR = 0x3C;
const Peripherals.I2cClient.I2cProtocol CAM_PROTO = Peripherals.I2cClient.I2cProtocol.SCCB; const Peripherals.I2cClient.I2cProtocol CAM_PROTO = Peripherals.I2cClient.I2cProtocol.SCCB;
const byte PLL_MUX = 10; const byte PLL_MUX = 60;
const UInt32 FrameAddr = 0x00; const UInt32 FrameAddr = 0x00;
// 动态分辨率参数 // 动态分辨率参数
@ -161,6 +162,56 @@ class Camera
return true; return true;
} }
public async ValueTask<Result<bool>> EnableCameraHardware(bool isEnable)
{
{
var ret = await UDPClientPool.WriteAddr(this.ep, this.taskID, CameraAddr.CAMERA_POWER, (isEnable ? 0x00000001u : 0x00000000u));
if (!ret.IsSuccessful)
{
logger.Error($"Failed to write STORE_ADDR: {ret.Error}");
return new(ret.Error);
}
if (!ret.Value)
{
logger.Error("STORE_ADDR write returned false");
return new(new Exception("STORE_ADDR write returned false"));
}
}
return true;
}
public async ValueTask<Result<bool>> SleepCameraHardware(bool isEnable)
{
{
var ret = await UDPClientPool.WriteAddr(this.ep, this.taskID, CameraAddr.CAMERA_POWER, (isEnable ? 0x00000101u : 0x00000001u));
if (!ret.IsSuccessful)
{
logger.Error($"Failed to write STORE_ADDR: {ret.Error}");
return new(ret.Error);
}
if (!ret.Value)
{
logger.Error("STORE_ADDR write returned false");
return new(new Exception("STORE_ADDR write returned false"));
}
}
await Task.Delay(5);
{
var ret = await UDPClientPool.WriteAddr(this.ep, this.taskID, CameraAddr.CAMERA_POWER, 0x00000101);
if (!ret.IsSuccessful)
{
logger.Error($"Failed to write STORE_ADDR: {ret.Error}");
return new(ret.Error);
}
if (!ret.Value)
{
logger.Error("STORE_ADDR write returned false");
return new(new Exception("STORE_ADDR write returned false"));
}
}
return true;
}
/// <summary> /// <summary>
/// 读取一帧图像数据 /// 读取一帧图像数据
/// </summary> /// </summary>
@ -177,7 +228,7 @@ class Camera
this.ep, this.ep,
this.taskID, // taskID this.taskID, // taskID
FrameAddr, FrameAddr,
(int)(_currentWidth * _currentHeight * 2), // 使用当前分辨率的动态大小 (int)_currentFrameLength, // 使用当前分辨率的动态大小
this.timeout); this.timeout);
if (!result.IsSuccessful) if (!result.IsSuccessful)
@ -250,7 +301,6 @@ class Camera
} }
} }
} }
return true; return true;
} }

View File

@ -157,6 +157,7 @@ public class HttpVideoStreamService : BackgroundService
} }
_cameraEnable = isEnabled; _cameraEnable = isEnabled;
await _camera.EnableCamera(_cameraEnable); await _camera.EnableCamera(_cameraEnable);
await _camera.SleepCameraHardware(!_cameraEnable);
} }
/// <summary> /// <summary>

View File

@ -480,6 +480,7 @@ public class UDPClientPool
if (outstanding >= 512 - batchSize) if (outstanding >= 512 - batchSize)
continue; continue;
// Send next batch of address packages (up to 128) // Send next batch of address packages (up to 128)
int batchSend = Math.Min(batchSize, pkgList.Count - sentCount); int batchSend = Math.Min(batchSize, pkgList.Count - sentCount);
var batchPkgs = pkgList.Skip(sentCount).Take(batchSend); var batchPkgs = pkgList.Skip(sentCount).Take(batchSend);

File diff suppressed because it is too large Load Diff

View File

@ -340,7 +340,7 @@ import {
AlertTriangle, AlertTriangle,
MoreHorizontal, MoreHorizontal,
} from "lucide-vue-next"; } from "lucide-vue-next";
import { VideoStreamClient, CameraConfigRequest } from "@/APIClient"; import { VideoStreamClient, CameraConfigRequest, ResolutionConfigRequest } from "@/APIClient";
import { useEquipments } from "@/stores/equipments"; import { useEquipments } from "@/stores/equipments";
const eqps = useEquipments(); const eqps = useEquipments();
@ -597,7 +597,8 @@ const refreshResolutions = async () => {
try { try {
addLog("info", "正在获取支持的分辨率列表..."); addLog("info", "正在获取支持的分辨率列表...");
const resolutions = await videoClient.getSupportedResolutions(); const resolutions = await videoClient.getSupportedResolutions();
supportedResolutions.value = resolutions; supportedResolutions.value = resolutions.resolutions;
console.log("支持的分辨率列表:", supportedResolutions.value);
// //
const currentRes = await videoClient.getCurrentResolution(); const currentRes = await videoClient.getCurrentResolution();
@ -629,7 +630,11 @@ const changeResolution = async () => {
} }
// //
const success = await videoClient.setResolution(selectedResolution.value.width, selectedResolution.value.height); const resolutionRequest = new ResolutionConfigRequest({
width: selectedResolution.value.width,
height: selectedResolution.value.height
});
const success = await videoClient.setResolution(resolutionRequest);
if (success) { if (success) {
// //