// --------------------------------------------
#pragma pack(push, 1)
// --------------------------------------------
typedef struct UvcSelectedMode{
float fps;
UvcFrameGeom geometry: 2; // just an enum
UvcFrameFmt format: 2; // just an enum
uint8_t reserved: 4;
} UvcMode;
C_ASSERT(sizeof(UvcMode) == 5);
typedef union FpgaCtrlReg{
uint8_t bm;
struct{
uint8_t video_en : 1;
uint8_t audio_en : 1;
uint8_t hsub_en : 1;
uint8_t dpc_en : 1;
uint8_t fmt_select : 1; // 0 - YUY2, 1 - NV12
uint8_t video_raw : 1;
uint8_t fan_en : 1;
uint8_t cfg_en : 1;
};
} FpgaCtrlReg;
C_ASSERT(sizeof(FpgaCtrlReg) == 1);
// global state of periferals cached in a single place for convenient access from everywhere
// this also allows us to implement API access to "internals" for debugging and monitoring
typedef struct {
uint16_t fpga_build;
FpgaCtrlReg fpga_ctrl; // FX3 controls the state of this FPGA register so makes sense to cache it here for faster read access
uint8_t gpif_initialized :1; // whether the GPIF init function has been called
uint8_t fpga_cfg_ready :1; // true if FPGA Configuration DMA has been configured
uint8_t force_fan_on_aux_pwr :1; // automatically turn the fan on if running on AUX power
uint8_t uvc_streaming_started :1; // whether USB host has started streaming video
uint8_t uac_streaming_started :1; // whether USB host has started streaming audio
uint8_t sfp_present :1; // `1` if there's a device present in SFP+ cage
UvcMode uvc_mode;
uint8_t sensor_tgt_y_avg;
uint16_t sensor_tgt_gain_g;
int16_t sensor_gain_r;
int16_t sensor_gain_b;
int16_t fpga_gain_r;
int16_t fpga_gain_b;
uint32_t awb_oe_trig_count; // FPGA reported a red overexposure event during AWB stats' accumulation
uint16_t last_usb_log_idx; // for drainig the logs out
// background scheduler is based off of the CyU3PThreadSleep(interval_main_step) in the main loop which non-blockingly waits before running tasks
uint16_t bg_main_step; // minimal polling interval for BG tasks
struct{
uint16_t color_grading // push Color Grading tables from cache to FPGA
, autoexp // AE
, awb // AWB
, sfp // SFP+ cage's PnP
, log // send accumulated logs from gl_UsbLogBuffer using CyU3PDebugPrint()
, health // check for internal errors and report via CyU3PDebugPrint()
, aux_pwr; // use power more liberally when running on AUX
} bg_interval // frequency of running a background task (the shorter the interval - the higher the frequency)
, bg_clock // bg task's timer counter
, bg_invocation // bg task's invocation counter
, bg_active_work; // count how many times bg task performed meaningful work (should usually be <= bg_invocation's counter)
} CachedGlobalState;
C_ASSERT(sizeof(CachedGlobalState) == 84);
// --------------------------------------------
#pragma pack(pop)
// --------------------------------------------