#ifndef VIDEO_PROC_H_ #define VIDEO_PROC_H_ #define VXR_FIRMWARE_LENGTH (16u) // max 15 characters and a null terminator #define TASK_VIDEO_PROC_STACK_SIZE (1024/sizeof(portSTACK_TYPE)) #define TASK_VIDEO_PROC_PRIORITY (tskIDLE_PRIORITY) #define VIDEO_TASK_DELAY (20u) #define VXR_RC_INTERFACE_DELAY (275u) // at least 250ms after reset before accessing remote control interface #define VIDEOPROC_NOTIFY_1V0_READY (1u << 0u) #define VIDEOPROC_NOTIFY_1V8_AND_OLED_PWR_READY (1u << 1u) #define VIDEOPROC_NOTIFY_VXR_RESET (1u << 2u) #define VIDEOPROC_NOTIFY_DEBUG_PROX_DISABLED (1u << 3u) #define VIDEOPROC_COLORBAR (1u << 4u) #define VIDEOPROC_DISP_POWER_DISABLE (1u << 5u) #define VIDEOPROC_DISP_POWER_ENABLE (1u << 6u) #define VIDEOPROC_NEW_FAN_SPEED (1u << 7u) #define VIDEOPROC_EYETRACKING_ERROR (1u << 8u) #define VIDEOPROC_EYETRACKING_ERROR_CLEAR (1u << 9u) #define VIDEOPROC_TRACK_UART_ACTIVITY (1u << 10u) #define VIDEOPROC_VXR_POWER_DOWN (1u << 11u) #define VIDEOPROC_VXR_POWER_UP (1u << 12u) #define VIDEOPROC_DOZE_SLEEP (1u << 13u) // enter doze (warm shallow sleep) #define VIDEOPROC_DOZE_WAKE (1u << 14u) // wake from doze #define VIDEOPROC_STACK_OVERFLOW (1u << 20u) #define VIDEOPROC_NOTIFY_TASKBITS (VIDEOPROC_NOTIFY_VXR_RESET | VIDEOPROC_NOTIFY_DEBUG_PROX_DISABLED \ | VIDEOPROC_COLORBAR | VIDEOPROC_DISP_POWER_DISABLE | VIDEOPROC_DISP_POWER_ENABLE \ | VIDEOPROC_NEW_FAN_SPEED | VIDEOPROC_EYETRACKING_ERROR | VIDEOPROC_EYETRACKING_ERROR_CLEAR \ | VIDEOPROC_TRACK_UART_ACTIVITY | VIDEOPROC_VXR_POWER_DOWN | VIDEOPROC_VXR_POWER_UP \ | VIDEOPROC_DOZE_SLEEP | VIDEOPROC_DOZE_WAKE ) #define DEFAULT_OLED_BRIGHTNESS (0x010Au) // 266d, or about 26% (max is 0x03FF = 1023d) #define NUM_BRIGHTNESS_RETRIES (3u) // Number of times to retry setting brightness if it failed // Doze (warm shallow sleep, ADR-0005): on doze-sleep the brightness is swept to // the floor over ~DOZE_SWEEP_MS, then the OLED display is turned off (true // black); doze-wake reverses it. The sweep advances one step per video-task // iteration (VIDEO_TASK_DELAY) so it is naturally target-seeking: a wake that // arrives mid-fade just flips the phase and the next iteration ramps back up. #define DOZE_BRIGHTNESS_FLOOR (0u) // register 0 = lowest emission #define DOZE_SWEEP_MS (300u) // target fade duration #define DOZE_SWEEP_STEPS (DOZE_SWEEP_MS / VIDEO_TASK_DELAY) // ~15 @ 20ms // The OLED is perceptually gamma'd: a register-linear sweep reads as a fast // jump then a slow crawl (camera-confirmed, docs/photon-latency-bench.md). The // sweep intent stays linear (so the target-seeking reversal logic is simple), // but the register actually written is gamma-mapped so perceived brightness // ramps evenly. >1 spends more of the sweep at low register (where the eye is // most sensitive). Camera luminance fit ~2.9; default a touch gentler. By ear. #define DOZE_SWEEP_GAMMA (2.2f) // Definitions for the display status #define VIDSTATUS_DISPLAYS_ON (1u << 0u) #define VIDSTATUS_PROX_ON (1u << 1u) #define VIDSTATUS_PROX_TIMER_EXPIRED (1u << 2u) #define VIDSTATUS_DSC_ENABLED (1u << 3u) #define VIDSTATUS_VIDEO_MODE_SHIFT (4u) // high nibble of byte 0 is the video mode, using Video_Selection_T from oled_control #define VIDSTATUS_LINK_RATE_SHIFT (8u) // low nibble of byte 1 is DisplayPort link rate // 0 = unknown // 1 = RBR (1.62 Gbps) // 2 = HBR (2.7 Gbps) // 3 = HBR2 (5.4 Gbps) // 4 = HBR3 (8.1 Gbps) #define VIDSTATUS_LANE_COUNT_SHIFT (12u) // high nibble of byte 1 is number of DisplayPort lanes typedef enum _Edid_Select{ EDID_DEFAULT = 0, EDID_90HZ_ONLY = 1, EDID_75HZ_ONLY = 2, EDID_72HZ_ONLY = 3 } Edid_Select_T; typedef enum FATP_Mode{ FATP_Mode_0 = 0x00, FATP_Mode_1 = 0x01, FATP_Mode_2 = 0x02, FATP_Mode_None = 0xFF } FATP_Mode_T; TaskHandle_t video_proc_task_handle(void); bool video_is_enabled(void); bool video_is_dozing(void); bool displays_are_on(void); void start_video_task(void); void task_video_proc(void *pvParameters); void video_proc_set_fatp_edid(FATP_Mode_T fatp_mode_sel); uint8_t video_proc_select_edid(Edid_Select_T edid_select); uint8_t video_set_brightness(uint16_t new_brightness); uint8_t video_set_colorbar(void); uint16_t video_get_brightness(void); uint16_t video_get_display_status(void); uint8_t video_get_vxr_status(void); void video_copy_vxr_firmware(uint8_t* fwname); bool proximity_disable(void); bool proximity_enable(void); #endif /* VIDEO_PROC_H_ */