diff --git a/conf/modules/board_matek_wing.xml b/conf/modules/board_matek_wing.xml index c843317955..8a1b014b83 100644 --- a/conf/modules/board_matek_wing.xml +++ b/conf/modules/board_matek_wing.xml @@ -25,8 +25,8 @@ - - + + diff --git a/sw/airborne/modules/display/max7456.c b/sw/airborne/modules/display/max7456.c index 2d12f9152d..8479645d32 100644 --- a/sw/airborne/modules/display/max7456.c +++ b/sw/airborne/modules/display/max7456.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Chris + * Copyright (C) 2013-2020 Chris Efstathiou hendrixgr@gmail.com * * This file is part of paparazzi. * @@ -70,7 +70,6 @@ typedef struct { static void vSubtractVectors(VECTOR *svA, VECTOR svB, VECTOR svC); static void vMultiplyMatrixByVector(VECTOR *svA, MATRIX smB, VECTOR svC); -static void check_osd_status(void); static float home_direction(void); static char ascii_to_osd_c(char c); static void osd_put_s(char *string, uint8_t attributes, uint8_t char_nb, uint8_t row, uint8_t column); @@ -114,7 +113,6 @@ uint8_t max7456_osd_status = OSD_UNINIT; uint8_t osd_enable = true; uint8_t osd_enable_val = OSD_IMAGE_ENABLE; uint8_t osd_stat_reg = 0; -bool osd_stat_reg_valid = false; float home_dir = 0; @@ -196,10 +194,9 @@ static float home_direction(void) * * WHEN home_dir = (float)(atan2(Home_PositionForPlane2.fy, (Home_PositionForPlane2.fx))); * - * plane front - * + * plane front * 0˚ - ^ + * ^ * I * -45˚ I 45˚ * \ I / @@ -207,7 +204,7 @@ static float home_direction(void) * -90˚-------I------- 90˚ * /I\ * / I \ - * -135˚ I 120˚ + * -135˚ I 135˚ * I * 180 * plane back @@ -215,33 +212,6 @@ static float home_direction(void) * */ - /* - * WHEN home_dir = (float)(atan2(Home_PositionForPlane2.fx, (Home_PositionForPlane2.fy))); - * - * - * plane front - * - * 90˚ - ^ - * I - * 135˚ I 45˚ - * \ I / - * \I/ - * 180˚-------I------- 0˚ - * /I\ - * / I \ - * -135˚ I -45˚ - * I - * -90 - * plane back - * - * - */ - - /* fPan = 0˚ -> antenna looks along the wing - 90˚ -> antenna looks in flight direction - -90˚ -> antenna looks backwards - */ /* fixed to the plane*/ home_dir = (float)(atan2(Home_PositionForPlane2.fy, (Home_PositionForPlane2.fx))); home_dir = DegOfRad(home_dir); @@ -250,28 +220,12 @@ static float home_direction(void) return (home_dir); } -static void check_osd_status(void) -{ - - osd_stat_reg_valid = FALSE; - - if (max7456_osd_status == OSD_IDLE) { - max7456_trans.output_length = 1; - max7456_trans.input_length = 1; - max7456_trans.output_buf[0] = OSD_STAT_REG; - max7456_osd_status = OSD_READ_STATUS; - spi_submit(&(MAX7456_SPI_DEV), &max7456_trans); - } - - return; -} - static char ascii_to_osd_c(char c) { #if defined USE_MATEK_TYPE_OSD_CHIP && USE_MATEK_TYPE_OSD_CHIP == 1 -PRINT_CONFIG_MSG("OSD USES THE CUSTOM MATEK TYPE OSD CHIP") - + PRINT_CONFIG_MSG("OSD USES THE CUSTOM MATEK TYPE OSD CHIP") + return (c); #else @@ -292,7 +246,6 @@ PRINT_CONFIG_MSG("OSD USES THE CUSTOM MATEK TYPE OSD CHIP") case (';'): c = 0x43; break; case (':'): c = 0x44; break; case (','): c = 0x45; break; - //case('''): c = 0x46; break; case ('/'): c = 0x47; break; case ('"'): c = 0x48; break; case ('-'): c = 0x49; break; @@ -580,11 +533,11 @@ void max7456_periodic(void) break; case (30): #if OSD_USE_MAG_COMPASS && !defined(SITL) -PRINT_CONFIG_MSG("OSD USES THE MAGNETIC HEADING") - temp = DegOfRad(MAG_Heading); + PRINT_CONFIG_MSG("OSD USES THE MAGNETIC HEADING") + temp = DegOfRad(MAG_Heading); if (temp < 0) { temp += 360; } #else -PRINT_CONFIG_MSG("OSD USES THE GPS HEADING") + PRINT_CONFIG_MSG("OSD USES THE GPS HEADING") temp = DegOfRad(state.h_speed_dir_f); if (temp < 0) { temp += 360; } #endif @@ -608,15 +561,15 @@ PRINT_CONFIG_MSG("OSD USES THE GPS HEADING") break; case (50): #if OSD_USE_BARO_ALTITUDE && !defined(SITL) -PRINT_CONFIG_MSG("OSD ALTITUDE IS COMING FROM BAROMETER") + PRINT_CONFIG_MSG("OSD ALTITUDE IS COMING FROM BAROMETER") #if defined BARO_ALTITUDE_VAR osd_sprintf(osd_string, "%.0fM", BARO_ALTITUDE_VAR); #else -PRINT_CONFIG_MSG("OSD USES THE DEFAULT BARO ALTITUDE VARIABLE") + PRINT_CONFIG_MSG("OSD USES THE DEFAULT BARO ALTITUDE VARIABLE") osd_sprintf(osd_string, "%.0fM", baro_alt); #endif #else -PRINT_CONFIG_MSG("ALTITUDE IS COMING FROM GPS") + PRINT_CONFIG_MSG("ALTITUDE IS COMING FROM GPS") osd_sprintf(osd_string, "%.0fM", GetPosAlt()); #endif osd_put_s(osd_string, L_JUST, 6, 14, 1); // "FALSE = L_JUST @@ -687,14 +640,8 @@ PRINT_CONFIG_MSG("ALTITUDE IS COMING FROM GPS") osd_put_s(osd_string, R_JUST, 5, 8, 13); } else { osd_put_s(" ", R_JUST, 5, 8, 13); } - step = 120; - break; - - case (120): - check_osd_status(); step = 10; break; - default: step = 10; break; } // End of switch statement. } // End of if (max7456_osd_status == OSD_UNINIT) @@ -731,13 +678,6 @@ void max7456_event(void) max7456_osd_status = OSD_FINISHED; spi_submit(&(MAX7456_SPI_DEV), &max7456_trans); break; - /* - case (OSD_READ_STATUS): - osd_stat_reg = max7456_trans.input_buf[0]; - osd_stat_reg_valid = true; - max7456_osd_status = OSD_FINISHED; - break; - */ case (OSD_S_STEP1): max7456_trans.output_length = 2; max7456_trans.output_buf[0] = OSD_DMAL_REG; @@ -764,23 +704,30 @@ void max7456_event(void) spi_submit(&(MAX7456_SPI_DEV), &max7456_trans); } break; - case (OSD_READ_STATUS): - osd_stat_reg = max7456_trans.input_buf[0]; - osd_stat_reg_valid = TRUE; - max7456_trans.status = SPITransDone; - max7456_osd_status = OSD_IDLE; - break; case (OSD_FINISHED): - osd_attr = 0; - max7456_trans.status = SPITransDone; - max7456_osd_status = OSD_IDLE; + max7456_trans.output_length = 1; + max7456_trans.input_length = 2; + max7456_trans.output_buf[0] = OSD_STAT_REG; + max7456_osd_status = OSD_READ_STATUS; + spi_submit(&(MAX7456_SPI_DEV), &max7456_trans); break; + case (OSD_READ_STATUS): + osd_stat_reg = max7456_trans.input_buf[1]; + if (osd_stat_reg & (OSD_NVRAM_BUSY_FLAG | OSD_RESET_BUSY_FLAG)) { + max7456_trans.output_length = 1; + max7456_trans.input_length = 2; + max7456_trans.output_buf[0] = OSD_STAT_REG; + max7456_osd_status = OSD_READ_STATUS; + spi_submit(&(MAX7456_SPI_DEV), &max7456_trans); + } else { + osd_attr = 0; + max7456_trans.status = SPITransDone; + max7456_osd_status = OSD_IDLE; + } + break; + default: break; } } return; } - - - - diff --git a/sw/airborne/modules/display/max7456_regs.h b/sw/airborne/modules/display/max7456_regs.h index 26885581ed..daaa528e2c 100644 --- a/sw/airborne/modules/display/max7456_regs.h +++ b/sw/airborne/modules/display/max7456_regs.h @@ -31,29 +31,39 @@ #define MAX7456_REGS_H //OSD REGISTER ADDRESSES -#define OSD_VM0_REG 0x00 -#define OSD_VM1_REG 0x01 -#define OSD_DMM_REG 0x04 -#define OSD_DMAH_REG 0x05 -#define OSD_DMAL_REG 0x06 -#define OSD_DMDI_REG 0x07 -#define OSD_OSDBL_REG 0x6C -#define OSD_OSDBL_REG_R 0xEC -#define OSD_STAT_REG 0xA0 +#define OSD_VM0_REG 0x00 +#define OSD_VM1_REG 0x01 +#define OSD_DMM_REG 0x04 +#define OSD_DMAH_REG 0x05 +#define OSD_DMAL_REG 0x06 +#define OSD_DMDI_REG 0x07 +#define OSD_OSDBL_REG 0x6C +#define OSD_OSDBL_REG_R 0xEC +#define OSD_STAT_REG 0xA0 //OSD BIT POSITIONS -#define OSD_VIDEO_MODE_PAL (1<<6) // Default = NTSC -#define OSD_SYNC_INTERNAL ((1<<5)|(1<<4)) // Default = AUTO -#define OSD_SYNC_EXTERNAL ((1<<5) // Default = AUTO -#define OSD_IMAGE_ENABLE (1<<3) // Default = OSD OFF +#define OSD_VIDEO_MODE_PAL (1<<6) // Default = NTSC +#define OSD_SYNC_INTERNAL ((1<<5)|(1<<4)) // Default = AUTO +#define OSD_SYNC_EXTERNAL ((1<<5) // Default = AUTO +#define OSD_IMAGE_ENABLE (1<<3) // Default = OSD OFF #define OSD_REFRESH_ON_NEXT_VSYNC (1<<2) // Default = immediately refresh video -#define OSD_RESET (1<<1) // VM0 reg, hardware set to 0 after reset -#define OSD_VOUT_DISABLE (1<<0) // default= VIDEO OUT ENABLED -#define OSD_8BIT_MODE (1<<6) // default= 16 BIT MODE -#define OSD_BLINK_CHAR (1<<4) // default= No BLINKING -#define OSD_INVERT_PIXELS (1<<3) // default= No INVERSION +#define OSD_RESET (1<<1) // VM0 reg, hardware set to 0 after reset +#define OSD_VOUT_DISABLE (1<<0) // default= VIDEO OUT ENABLED +#define OSD_8BIT_MODE (1<<6) // default= 16 BIT MODE +#define OSD_BLINK_CHAR (1<<4) // default= No BLINKING +#define OSD_INVERT_PIXELS (1<<3) // default= No INVERSION #define OSD_CLEAR_DISPLAY_MEMORY (1<<2) // DMM reg, default = 0 -#define OSD_AUTO_INCREMENT_MODE (1<<0) // default = NO AUTO INCREMENT +#define OSD_AUTO_INCREMENT_MODE (1<<0) // default = NO AUTO INCREMENT + +//OSD STATUS REGISTER BIT POSITIONS +#define OSD_UNUSED_FLAG (1<<7) // It is not used. +#define OSD_RESET_BUSY_FLAG (1<<6) // 0=power on reset completed, 1=busy with reset. +#define OSD_NVRAM_BUSY_FLAG (1<<5) // 0=memory available, 1=memory busy +#define OSD_VSYNC_ABSENT_FLAG (1<<4) // 0=vertical sync active, 1= no vsync +#define OSD_HSYNC_ABSENT_FLAG (1<<3) // 0=Horizontal sync active, 1= no Hsync +#define OSD_LOS_ABSENT_FLAG (1<<2) // 0=sync active, 1= no sync +#define OSD_NTSC_PRESENT_FLAG (1<<1) // 0=No NTSC signal detected, 1=NTSC signal detected. +#define OSD_PAL_PRESENT_FLAG (1<<0) // 0=No PAL signal detected, 1=PAL signal detected. // MAX7456 VIDEO_MODE_0 register #define VIDEO_MODE_0_WRITE 0x00 @@ -120,14 +130,6 @@ // MAX7456 FM_DATA_OUT register #define FM_DATA_OUT_READ 0xC0 -// MAX7456 STATUS register -#define STATUS_READ 0xA0 -#define STATUS_40_RESET_BUSY 0x40 -#define STATUS_20_NVRAM_BUSY 0x20 -#define STATUS_04_LOSS_OF_SYNC 0x04 -#define STATUS_02_PAL_DETECTED 0x02 -#define STATUS_01_NTSC_DETECTED 0x01 - // MAX7456 requires clearing OSD Black Level register bit 0x10 after reset #define OSDBL_WR 0x6C #define OSDBL_RD 0xEC