feat: 增加了摄像头硬件复位和唤醒逻辑
This commit is contained in:
@@ -11,6 +11,7 @@ static class CameraAddr
|
||||
public const UInt32 STORE_NUM = BASE + 0x13;
|
||||
public const UInt32 EXPECTED_VH = BASE + 0x14;
|
||||
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
|
||||
@@ -26,7 +27,7 @@ class Camera
|
||||
|
||||
const uint CAM_I2C_ADDR = 0x3C;
|
||||
const Peripherals.I2cClient.I2cProtocol CAM_PROTO = Peripherals.I2cClient.I2cProtocol.SCCB;
|
||||
const byte PLL_MUX = 10;
|
||||
const byte PLL_MUX = 60;
|
||||
const UInt32 FrameAddr = 0x00;
|
||||
|
||||
// 动态分辨率参数
|
||||
@@ -161,6 +162,56 @@ class Camera
|
||||
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>
|
||||
@@ -177,7 +228,7 @@ class Camera
|
||||
this.ep,
|
||||
this.taskID, // taskID
|
||||
FrameAddr,
|
||||
(int)(_currentWidth * _currentHeight * 2), // 使用当前分辨率的动态大小
|
||||
(int)_currentFrameLength, // 使用当前分辨率的动态大小
|
||||
this.timeout);
|
||||
|
||||
if (!result.IsSuccessful)
|
||||
@@ -250,7 +301,6 @@ class Camera
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user