From 06fdc50169abefbeda084d85fd011ef9c6aba735 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 24 Jun 2018 21:17:05 +1000 Subject: [PATCH] AP_OSD: switched to 2-d arrays makes it a bit easier to read --- libraries/AP_OSD/AP_OSD_MAX7456.cpp | 60 +++++++++++++++-------------- libraries/AP_OSD/AP_OSD_MAX7456.h | 18 +++++---- 2 files changed, 41 insertions(+), 37 deletions(-) diff --git a/libraries/AP_OSD/AP_OSD_MAX7456.cpp b/libraries/AP_OSD/AP_OSD_MAX7456.cpp index 107df8522e..e90ed58317 100644 --- a/libraries/AP_OSD/AP_OSD_MAX7456.cpp +++ b/libraries/AP_OSD/AP_OSD_MAX7456.cpp @@ -136,7 +136,7 @@ AP_OSD_MAX7456::AP_OSD_MAX7456(AP_OSD &osd, AP_HAL::OwnPtr dev): AP_OSD_Backend(osd), _dev(std::move(dev)) { video_signal_reg = VIDEO_MODE_PAL | OSD_ENABLE; - max_screen_size = video_buffer_chars_pal; + video_lines = video_lines_pal; } bool AP_OSD_MAX7456::init() @@ -269,10 +269,10 @@ void AP_OSD_MAX7456::reinit() _dev->read_registers(MAX7456ADD_STAT, &sense, 1); if (VIN_IS_PAL(sense)) { video_signal_reg = VIDEO_MODE_PAL | OSD_ENABLE; - max_screen_size = video_buffer_chars_pal; + video_lines = video_lines_pal; } else { video_signal_reg = VIDEO_MODE_NTSC | OSD_ENABLE; - max_screen_size = video_buffer_chars_ntsc; + video_lines = video_lines_ntsc; } // set all rows to same character black/white level @@ -286,8 +286,8 @@ void AP_OSD_MAX7456::reinit() _dev->write_register(MAX7456ADD_DMM, DMM_CLEAR_DISPLAY); // force redrawing all screen - memset(shadow_frame, 0xFF, video_buffer_chars_pal); - memset(shadow_attr, 0xFF, video_buffer_chars_pal); + memset(shadow_frame, 0xFF, sizeof(shadow_frame)); + memset(shadow_attr, 0xFF, sizeof(shadow_attr)); initialized = true; } @@ -313,25 +313,29 @@ void AP_OSD_MAX7456::transfer_frame() } buffer_offset = 0; - for (uint16_t pos=0; pos max_updated_chars) { - break; - } - shadow_frame[pos] = frame[pos]; - shadow_attr[pos] = attr[pos]; - uint8_t attribute = attr[pos] & (DMM_BLINK | DMM_INVERT_PIXEL_COLOR); - uint8_t chr = frame[pos]; - - if (attribute != last_attribute) { - buffer_add_cmd(MAX7456ADD_DMM, attribute); - last_attribute = attribute; + for (uint8_t y=0; y max_updated_chars) { + break; + } + shadow_frame[y][x] = frame[y][x]; + shadow_attr[y][x] = attr[y][x]; + uint8_t attribute = attr[y][x] & (DMM_BLINK | DMM_INVERT_PIXEL_COLOR); + uint8_t chr = frame[y][x]; + + if (attribute != last_attribute) { + buffer_add_cmd(MAX7456ADD_DMM, attribute); + last_attribute = attribute; + } + uint16_t pos = y * video_columns + x; + buffer_add_cmd(MAX7456ADD_DMAH, pos >> 8); + buffer_add_cmd(MAX7456ADD_DMAL, pos & 0xFF); + buffer_add_cmd(MAX7456ADD_DMDI, chr); } - buffer_add_cmd(MAX7456ADD_DMAH, pos >> 8); - buffer_add_cmd(MAX7456ADD_DMAL, pos & 0xFF); - buffer_add_cmd(MAX7456ADD_DMDI, chr); } if (buffer_offset > 0) { @@ -343,10 +347,8 @@ void AP_OSD_MAX7456::transfer_frame() void AP_OSD_MAX7456::clear() { - for (uint16_t i=0; i +#include class AP_OSD_MAX7456 : public AP_OSD_Backend { @@ -55,20 +56,21 @@ private: uint8_t video_signal_reg; bool initialized; - static const uint16_t video_buffer_chars_ntsc = 390; - static const uint16_t video_buffer_chars_pal = 480; + static const uint8_t video_lines_ntsc = 13; + static const uint8_t video_lines_pal = 16; + static const uint8_t video_columns = 30; static const uint8_t max_updated_chars = 64; static const uint16_t spi_buffer_size = ((max_updated_chars + 1) * 8); - uint8_t frame[video_buffer_chars_pal]; + uint8_t frame[video_lines_pal][video_columns]; //frame already transfered to max //used to optimize number of characters updated - uint8_t shadow_frame[video_buffer_chars_pal]; + uint8_t shadow_frame[video_lines_pal][video_columns]; - uint8_t attr[video_buffer_chars_pal]; - - uint8_t shadow_attr[video_buffer_chars_pal]; + // this assumes at most 32 columns + uint8_t attr[video_lines_pal][video_columns]; + uint8_t shadow_attr[video_lines_pal][video_columns]; uint8_t buffer[spi_buffer_size]; int buffer_offset; @@ -76,5 +78,5 @@ private: uint32_t last_signal_check; uint32_t video_detect_time; - uint16_t max_screen_size; + uint16_t video_lines; };