camera/
messages.rs

1// SPDX-FileCopyrightText: 2023 Foundation Devices, Inc. <hello@foundation.xyz>
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4use crate::{Frame, SubscriptionError};
5
6#[derive(Debug, server::Message, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
7#[event(Frame)]
8#[error(SubscriptionError)]
9pub struct Subscribe;
10
11#[derive(Debug, server::Message)]
12pub struct SetEnabled(pub bool);
13
14#[derive(Debug, server::Message)]
15pub struct NotifyVisible(pub bool);
16
17#[derive(Debug, server::Message)]
18#[response(bool)]
19pub struct IsEnabled;
20
21#[derive(Debug, server::Message)]
22#[response(bool)]
23pub struct IsInUse;
24
25/// Get current camera parameters
26#[derive(Debug, server::Message, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
27#[response(CameraParams)]
28pub struct GetParams;
29
30/// Set camera parameters (wraps [`CameraParams`])
31#[derive(Debug, server::Message, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
32pub struct SetParams(pub CameraParams);
33
34/// Camera parameters struct
35#[derive(Debug, Clone, Copy, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
36pub struct CameraParams {
37    /// Auto control flags: bit0=AEC, bit1=AWB, bit2=AGC
38    pub auto_controls: u8,
39    /// AGC ceiling: 0=2x, 1=4x, 2=8x, 3=16x
40    pub agc_ceiling: u8,
41    /// Brightness: 0-255, default: 0
42    pub brightness: u8,
43    /// Contrast: 0-255
44    pub contrast: u8,
45    /// Saturation: 0-255
46    pub saturation: u8,
47    /// Sharpness: 0-31 (manual mode only)
48    pub sharpness: u8,
49    /// Denoise: 0-255 (manual mode only)
50    pub denoise: u8,
51    /// Auto sharpness enabled
52    pub auto_sharpness: bool,
53    /// Auto denoise enabled
54    pub auto_denoise: bool,
55}
56
57impl Default for CameraParams {
58    fn default() -> Self { Self::DEFAULT }
59}
60
61impl CameraParams {
62    pub const DEFAULT: Self = Self {
63        auto_controls: 0x07,   // AEC+AWB+AGC all enabled
64        agc_ceiling: 1,        // 4x max gain
65        brightness: 0,         // Default brightness
66        contrast: 0x28,        // Default contrast (40)
67        saturation: 0x50,      // Default saturation (80)
68        sharpness: 0x04,       // Default sharpness (4) per datasheet
69        denoise: 0x08,         // Default denoise (8) per datasheet
70        auto_sharpness: false, // Manual mode by default
71        auto_denoise: false,   // Manual mode by default
72    };
73}