Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Marcin Baliniak 2016-09-25 11:24:51 +02:00
commit 0892c4786b
6 changed files with 1485 additions and 1613 deletions

View File

@ -136,7 +136,7 @@ typedef struct master_t {
#endif
#ifdef OSD
osd_profile osdProfile;
osd_profile_t osdProfile;
#endif
profile_t profile[MAX_PROFILE_COUNT];

View File

@ -37,43 +37,42 @@
#include "max7456.h"
#include "max7456_symbols.h"
//on shared SPI buss we want to change clock for OSD chip and restore for other devices
// On shared SPI bus we want to change clock for OSD chip and restore for other devices
#ifdef MAX7456_SPI_CLK
#define ENABLE_MAX7456 {spiSetDivisor(MAX7456_SPI_INSTANCE, MAX7456_SPI_CLK);IOLo(max7456CsPin);}
#define ENABLE_MAX7456 {spiSetDivisor(MAX7456_SPI_INSTANCE, MAX7456_SPI_CLK);IOLo(max7456CsPin);}
#else
#define ENABLE_MAX7456 IOLo(max7456CsPin)
#define ENABLE_MAX7456 IOLo(max7456CsPin)
#endif
#ifdef MAX7456_RESTORE_CLK
#define DISABLE_MAX7456 {IOHi(max7456CsPin);spiSetDivisor(MAX7456_SPI_INSTANCE, MAX7456_RESTORE_CLK);}
#define DISABLE_MAX7456 {IOHi(max7456CsPin);spiSetDivisor(MAX7456_SPI_INSTANCE, MAX7456_RESTORE_CLK);}
#else
#define DISABLE_MAX7456 IOHi(max7456CsPin)
#define DISABLE_MAX7456 IOHi(max7456CsPin)
#endif
uint16_t max_screen_size = VIDEO_BUFFER_CHARS_PAL;
uint16_t maxScreenSize = VIDEO_BUFFER_CHARS_PAL;
// we write everything in SCREEN_BUFFER and then comapre
// SCREEN_BUFFER with SHADOW_BUFFER to upgrade only changed chars
// this solution is faster then redraw all screen
static uint8_t SCREEN_BUFFER[VIDEO_BUFFER_CHARS_PAL+40]; //for faster writes we use memcpy so we need some space to don't overwrite buffer
static uint8_t SCREEN_BUFFER[VIDEO_BUFFER_CHARS_PAL + 40]; //for faster writes we use memcpy so we need some space to don't overwrite buffer
static uint8_t SHADOW_BUFFER[VIDEO_BUFFER_CHARS_PAL];
//max chars to update in one idle
#define MAX_CHARS2UPDATE 100
#ifdef MAX7456_DMA_CHANNEL_TX
volatile uint8_t dma_transaction_in_progress = 0;
#endif
volatile bool dmaTxInProgress = false;
#endif // MAX7456_DMA_CHANNEL_TX
static uint8_t spi_buff[MAX_CHARS2UPDATE*6];
static uint8_t spiBuffer[MAX_CHARS2UPDATE * 6];
static uint8_t video_signal_cfg = 0;
static uint8_t video_signal_reg = VIDEO_MODE_PAL | OSD_ENABLE; //PAL by default
static uint8_t max7456_lock = 0;
static IO_t max7456CsPin = IO_NONE;
static bool fontIsLoading = false;
static uint8_t videoSignalCfg = 0;
static uint8_t videoSignalReg = VIDEO_MODE_PAL | OSD_ENABLE; //PAL by default
static bool max7456Lock = false;
static IO_t max7456CsPin = IO_NONE;
static bool fontIsLoading = false;
static uint8_t max7456_send(uint8_t add, uint8_t data)
{
static uint8_t max7456_send(uint8_t add, uint8_t data) {
spiTransferByte(MAX7456_SPI_INSTANCE, add);
return spiTransferByte(MAX7456_SPI_INSTANCE, data);
}
@ -83,15 +82,15 @@ static void max7456_send_dma(void* tx_buffer, void* rx_buffer, uint16_t buffer_s
DMA_InitTypeDef DMA_InitStructure;
#ifdef MAX7456_DMA_CHANNEL_RX
static uint16_t dummy[] = {0xffff};
#else
#else // MAX7456_DMA_CHANNEL_RX
UNUSED(rx_buffer);
#endif
while (dma_transaction_in_progress); // Wait for prev DMA transaction
#endif // MAX7456_DMA_CHANNEL_RX
while (dmaTxInProgress); // Wait for prev DMA transaction
DMA_DeInit(MAX7456_DMA_CHANNEL_TX);
#ifdef MAX7456_DMA_CHANNEL_RX
DMA_DeInit(MAX7456_DMA_CHANNEL_RX);
#endif
#endif // MAX7456_DMA_CHANNEL_RX
// Common to both channels
DMA_StructInit(&DMA_InitStructure);
@ -108,24 +107,24 @@ static void max7456_send_dma(void* tx_buffer, void* rx_buffer, uint16_t buffer_s
#ifdef STM32F4
DMA_InitStructure.DMA_Memory0BaseAddr = rx_buffer ? (uint32_t)rx_buffer : (uint32_t)(dummy);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
#else
#else // STM32F4
DMA_InitStructure.DMA_MemoryBaseAddr = rx_buffer ? (uint32_t)rx_buffer : (uint32_t)(dummy);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
#endif
#endif // STM32F4
DMA_InitStructure.DMA_MemoryInc = rx_buffer ? DMA_MemoryInc_Enable : DMA_MemoryInc_Disable;
DMA_Init(MAX7456_DMA_CHANNEL_RX, &DMA_InitStructure);
DMA_Cmd(MAX7456_DMA_CHANNEL_RX, ENABLE);
#endif
#endif // MAX7456_DMA_CHANNEL_RX
// Tx channel
#ifdef STM32F4
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)tx_buffer; //max7456_screen;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
#else
#else // STM32F4
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)tx_buffer; //max7456_screen;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
#endif
#endif // STM32F4
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_Init(MAX7456_DMA_CHANNEL_TX, &DMA_InitStructure);
@ -133,18 +132,18 @@ static void max7456_send_dma(void* tx_buffer, void* rx_buffer, uint16_t buffer_s
#ifdef MAX7456_DMA_CHANNEL_RX
DMA_ITConfig(MAX7456_DMA_CHANNEL_RX, DMA_IT_TC, ENABLE);
#else
#else // MAX7456_DMA_CHANNEL_RX
DMA_ITConfig(MAX7456_DMA_CHANNEL_TX, DMA_IT_TC, ENABLE);
#endif
#endif // MAX7456_DMA_CHANNEL_RX
// Enable SPI TX/RX request
ENABLE_MAX7456;
dma_transaction_in_progress = 1;
dmaTxInProgress = true;
SPI_I2S_DMACmd(MAX7456_SPI_INSTANCE,
#ifdef MAX7456_DMA_CHANNEL_RX
SPI_I2S_DMAReq_Rx |
#endif
#endif // MAX7456_DMA_CHANNEL_RX
SPI_I2S_DMAReq_Tx, ENABLE);
}
@ -153,7 +152,7 @@ void max7456_dma_irq_handler(dmaChannelDescriptor_t* descriptor) {
if (DMA_GET_FLAG_STATUS(descriptor, DMA_IT_TCIF)) {
#ifdef MAX7456_DMA_CHANNEL_RX
DMA_Cmd(MAX7456_DMA_CHANNEL_RX, DISABLE);
#endif
#endif // MAX7456_DMA_CHANNEL_RX
// make sure spi dmd transfer is complete
while (SPI_I2S_GetFlagStatus (MAX7456_SPI_INSTANCE, SPI_I2S_FLAG_TXE) == RESET) {};
while (SPI_I2S_GetFlagStatus (MAX7456_SPI_INSTANCE, SPI_I2S_FLAG_BSY) == SET) {};
@ -171,11 +170,11 @@ void max7456_dma_irq_handler(dmaChannelDescriptor_t* descriptor) {
SPI_I2S_DMACmd(MAX7456_SPI_INSTANCE,
#ifdef MAX7456_DMA_CHANNEL_RX
SPI_I2S_DMAReq_Rx |
#endif
#endif // MAX7456_DMA_CHANNEL_RX
SPI_I2S_DMAReq_Tx, DISABLE);
DISABLE_MAX7456;
dma_transaction_in_progress = 0;
dmaTxInProgress = false;
}
if (DMA_GET_FLAG_STATUS(descriptor, DMA_IT_HTIF)) {
@ -185,12 +184,10 @@ void max7456_dma_irq_handler(dmaChannelDescriptor_t* descriptor) {
DMA_CLEAR_FLAG(descriptor, DMA_IT_TEIF);
}
}
#endif // MAX7456_DMA_CHANNEL_TX
#endif
uint8_t max7456_get_rows_count(void)
{
if (video_signal_reg & VIDEO_MODE_PAL)
uint8_t max7456_get_rows_count(void) {
if (videoSignalReg & VIDEO_MODE_PAL)
return VIDEO_LINES_PAL;
return VIDEO_LINES_NTSC;
@ -198,12 +195,11 @@ uint8_t max7456_get_rows_count(void)
//because MAX7456 need some time to detect video system etc. we need to wait for a while to initialize it at startup
//and in case of restart we need to reinitialize chip
void max7456_init2(void)
{
uint8_t max_screen_rows;
void max7456_init2(void) {
uint8_t maxScreenRows;
uint8_t srdata = 0;
uint16_t x;
static uint8_t first_init = 1;
static bool firstInit = true;
//do not init MAX before camera power up correctly
if (millis() < 1500)
@ -211,53 +207,50 @@ void max7456_init2(void)
ENABLE_MAX7456;
switch(video_signal_cfg) {
switch(videoSignalCfg) {
case PAL:
video_signal_reg = VIDEO_MODE_PAL | OSD_ENABLE;
videoSignalReg = VIDEO_MODE_PAL | OSD_ENABLE;
break;
case NTSC:
video_signal_reg = VIDEO_MODE_NTSC | OSD_ENABLE;
videoSignalReg = VIDEO_MODE_NTSC | OSD_ENABLE;
break;
default:
srdata = max7456_send(MAX7456ADD_STAT, 0x00);
if ((0x02 & srdata) == 0x02)
video_signal_reg = VIDEO_MODE_NTSC | OSD_ENABLE;
videoSignalReg = VIDEO_MODE_NTSC | OSD_ENABLE;
}
if (video_signal_reg & VIDEO_MODE_PAL) { //PAL
max_screen_size = VIDEO_BUFFER_CHARS_PAL;
max_screen_rows = VIDEO_LINES_PAL;
if (videoSignalReg & VIDEO_MODE_PAL) { //PAL
maxScreenSize = VIDEO_BUFFER_CHARS_PAL;
maxScreenRows = VIDEO_LINES_PAL;
} else { // NTSC
max_screen_size = VIDEO_BUFFER_CHARS_NTSC;
max_screen_rows = VIDEO_LINES_NTSC;
maxScreenSize = VIDEO_BUFFER_CHARS_NTSC;
maxScreenRows = VIDEO_LINES_NTSC;
}
// set all rows to same charactor black/white level
for(x = 0; x < max_screen_rows; x++) {
for(x = 0; x < maxScreenRows; x++) {
max7456_send(MAX7456ADD_RB0 + x, BWBRIGHTNESS);
}
// make sure the Max7456 is enabled
max7456_send(VM0_REG, video_signal_reg);
max7456_send(VM0_REG, videoSignalReg);
max7456_send(DMM_REG, CLEAR_DISPLAY);
DISABLE_MAX7456;
//clear shadow to force redraw all screen in non-dma mode
memset(SHADOW_BUFFER, 0, max_screen_size);
if (first_init)
{
memset(SHADOW_BUFFER, 0, maxScreenSize);
if (firstInit) {
max7456_refresh_all();
first_init = 0;
firstInit = false;
}
}
//here we init only CS and try to init MAX for first time
void max7456_init(uint8_t video_system)
{
void max7456_init(uint8_t videoSystem) {
#ifdef MAX7456_SPI_CS_PIN
max7456CsPin = IOGetByTag(IO_TAG(MAX7456_SPI_CS_PIN));
#endif
#endif // MAX7456_SPI_CS_PIN
IOInit(max7456CsPin, OWNER_OSD, RESOURCE_SPI_CS, 0);
IOConfigGPIO(max7456CsPin, SPI_IO_CS_CFG);
@ -266,115 +259,107 @@ void max7456_init(uint8_t video_system)
ENABLE_MAX7456;
max7456_send(VM0_REG, MAX7456_RESET);
DISABLE_MAX7456;
video_signal_cfg = video_system;
videoSignalCfg = videoSystem;
#ifdef MAX7456_DMA_CHANNEL_TX
dmaSetHandler(MAX7456_DMA_IRQ_HANDLER_ID, max7456_dma_irq_handler, NVIC_PRIO_MAX7456_DMA, 0);
#endif
#endif // MAX7456_DMA_CHANNEL_TX
//real init will be made letter when driver idle detect
}
//just fill with spaces with some tricks
void max7456_clear_screen(void)
{
uint16_t x;
uint32_t *p = (uint32_t*)&SCREEN_BUFFER[0];
for (x = 0; x < VIDEO_BUFFER_CHARS_PAL/4; x++)
p[x] = 0x20202020;
void max7456_clear_screen(void) {
uint16_t x;
uint32_t *p = (uint32_t*)&SCREEN_BUFFER[0];
for (x = 0; x < VIDEO_BUFFER_CHARS_PAL/4; x++)
p[x] = 0x20202020;
}
uint8_t* max7456_get_screen_buffer(void) {
return SCREEN_BUFFER;
}
void max7456_write_char(uint8_t x, uint8_t y, uint8_t c)
{
SCREEN_BUFFER[y*30+x] = c;
void max7456_write_char(uint8_t x, uint8_t y, uint8_t c) {
SCREEN_BUFFER[y*30+x] = c;
}
void max7456_write(uint8_t x, uint8_t y, char *buff)
{
uint8_t i = 0;
for (i = 0; *(buff+i); i++)
if (x+i < 30) //do not write over screen
SCREEN_BUFFER[y*30+x+i] = *(buff+i);
void max7456_write(uint8_t x, uint8_t y, char *buff) {
uint8_t i = 0;
for (i = 0; *(buff+i); i++)
if (x+i < 30) //do not write over screen
SCREEN_BUFFER[y*30+x+i] = *(buff+i);
}
#ifdef MAX7456_DMA_CHANNEL_TX
uint8_t max7456_dma_in_progres(void)
{
return dma_transaction_in_progress;
uint8_t max7456_dma_in_progres(void) {
return dmaTxInProgress;
}
#endif
#endif // MAX7456_DMA_CHANNEL_TX
void max7456_draw_screen(void) {
uint8_t check;
static uint16_t pos = 0;
int k = 0, buff_len=0;
if (!max7456_lock && !fontIsLoading) {
if (!max7456Lock && !fontIsLoading) {
//-----------------detect MAX7456 fail, or initialize it at startup when it is ready--------
max7456_lock = 1;
max7456Lock = true;
ENABLE_MAX7456;
check = max7456_send(VM0_REG | 0x80, 0x00);
DISABLE_MAX7456;
if ( check != video_signal_reg )
if ( check != videoSignalReg )
max7456_init2();
//------------ end of (re)init-------------------------------------
for (k=0; k< MAX_CHARS2UPDATE; k++)
{
if (SCREEN_BUFFER[pos] != SHADOW_BUFFER[pos])
{
spi_buff[buff_len++] = MAX7456ADD_DMAH;
spi_buff[buff_len++] = pos >> 8;
spi_buff[buff_len++] = MAX7456ADD_DMAL;
spi_buff[buff_len++] = pos & 0xff;
spi_buff[buff_len++] = MAX7456ADD_DMDI;
spi_buff[buff_len++] = SCREEN_BUFFER[pos];
for (k=0; k< MAX_CHARS2UPDATE; k++) {
if (SCREEN_BUFFER[pos] != SHADOW_BUFFER[pos]) {
spiBuffer[buff_len++] = MAX7456ADD_DMAH;
spiBuffer[buff_len++] = pos >> 8;
spiBuffer[buff_len++] = MAX7456ADD_DMAL;
spiBuffer[buff_len++] = pos & 0xff;
spiBuffer[buff_len++] = MAX7456ADD_DMDI;
spiBuffer[buff_len++] = SCREEN_BUFFER[pos];
SHADOW_BUFFER[pos] = SCREEN_BUFFER[pos];
k++;
}
if (++pos >= max_screen_size) {
if (++pos >= maxScreenSize) {
pos = 0;
break;
}
}
if (buff_len) {
#ifdef MAX7456_DMA_CHANNEL_TX
#ifdef MAX7456_DMA_CHANNEL_TX
if (buff_len > 0)
max7456_send_dma(spi_buff, NULL, buff_len);
#else
max7456_send_dma(spiBuffer, NULL, buff_len);
#else
ENABLE_MAX7456;
for (k=0; k < buff_len; k++)
spiTransferByte(MAX7456_SPI_INSTANCE, spi_buff[k]);
spiTransferByte(MAX7456_SPI_INSTANCE, spiBuffer[k]);
DISABLE_MAX7456;
#endif // MAX7456_DMA_CHANNEL_TX
#endif // MAX7456_DMA_CHANNEL_TX
}
max7456_lock = 0;
max7456Lock = 0;
}
}
// this funcktion refresh all and should not be used when copter is armed
void max7456_refresh_all(void)
{
if (!max7456_lock) {
void max7456_refresh_all(void) {
if (!max7456Lock) {
#ifdef MAX7456_DMA_CHANNEL_TX
while (dma_transaction_in_progress);
while (dmaTxInProgress);
#endif
uint16_t xx;
max7456_lock = 1;
max7456Lock = true;
ENABLE_MAX7456;
max7456_send(MAX7456ADD_DMAH, 0);
max7456_send(MAX7456ADD_DMAL, 0);
max7456_send(MAX7456ADD_DMM, 1);
for (xx = 0; xx < max_screen_size; ++xx)
{
for (xx = 0; xx < maxScreenSize; ++xx) {
max7456_send(MAX7456ADD_DMDI, SCREEN_BUFFER[xx]);
SHADOW_BUFFER[xx] = SCREEN_BUFFER[xx];
}
@ -382,7 +367,7 @@ void max7456_refresh_all(void)
max7456_send(MAX7456ADD_DMDI, 0xFF);
max7456_send(MAX7456ADD_DMM, 0);
DISABLE_MAX7456;
max7456_lock = 0;
max7456Lock = 0;
}
}
@ -390,10 +375,10 @@ void max7456_write_nvm(uint8_t char_address, uint8_t *font_data) {
uint8_t x;
#ifdef MAX7456_DMA_CHANNEL_TX
while (dma_transaction_in_progress);
while (dmaTxInProgress);
#endif
while (max7456_lock);
max7456_lock = 1;
while (max7456Lock);
max7456Lock = true;
ENABLE_MAX7456;
// disable display
@ -407,9 +392,9 @@ void max7456_write_nvm(uint8_t char_address, uint8_t *font_data) {
max7456_send(MAX7456ADD_CMDI, font_data[x]);
#ifdef LED0_TOGGLE
LED0_TOGGLE;
#else
#else // LED0_TOGGLE
LED1_TOGGLE;
#endif
#endif // LED0_TOGGLE
}
// transfer 54 bytes from shadow ram to NVM
@ -420,8 +405,7 @@ void max7456_write_nvm(uint8_t char_address, uint8_t *font_data) {
DISABLE_MAX7456;
max7456_lock = 0;
max7456Lock = 0;
}
#endif
#endif // USE_MAX7456

View File

@ -20,6 +20,7 @@
#ifndef WHITEBRIGHTNESS
#define WHITEBRIGHTNESS 0x01
#endif
#ifndef BLACKBRIGHTNESS
#define BLACKBRIGHTNESS 0x00
#endif
@ -35,19 +36,18 @@
#define VM1_REG 0x01
// video mode register 0 bits
#define VIDEO_BUFFER_DISABLE 0x01
#define MAX7456_RESET 0x02
#define VERTICAL_SYNC_NEXT_VSYNC 0x04
#define OSD_ENABLE 0x08
#define SYNC_MODE_AUTO 0x00
#define SYNC_MODE_INTERNAL 0x30
#define SYNC_MODE_EXTERNAL 0x20
#define VIDEO_MODE_PAL 0x40
#define VIDEO_MODE_NTSC 0x00
#define VIDEO_BUFFER_DISABLE 0x01
#define MAX7456_RESET 0x02
#define VERTICAL_SYNC_NEXT_VSYNC 0x04
#define OSD_ENABLE 0x08
#define SYNC_MODE_AUTO 0x00
#define SYNC_MODE_INTERNAL 0x30
#define SYNC_MODE_EXTERNAL 0x20
#define VIDEO_MODE_PAL 0x40
#define VIDEO_MODE_NTSC 0x00
// video mode register 1 bits
// duty cycle is on_off
#define BLINK_DUTY_CYCLE_50_50 0x00
#define BLINK_DUTY_CYCLE_33_66 0x01
@ -61,8 +61,8 @@
#define BLINK_TIME_3 0x0C
// background mode brightness (percent)
#define BACKGROUND_BRIGHTNESS_0 0x00
#define BACKGROUND_BRIGHTNESS_7 0x01
#define BACKGROUND_BRIGHTNESS_0 0x00
#define BACKGROUND_BRIGHTNESS_7 0x01
#define BACKGROUND_BRIGHTNESS_14 0x02
#define BACKGROUND_BRIGHTNESS_21 0x03
#define BACKGROUND_BRIGHTNESS_28 0x04
@ -73,10 +73,9 @@
#define BACKGROUND_MODE_GRAY 0x40
//MAX7456 commands
#define CLEAR_DISPLAY 0x04
#define CLEAR_DISPLAY_VERT 0x06
#define END_STRING 0xff
#define CLEAR_DISPLAY 0x04
#define CLEAR_DISPLAY_VERT 0x06
#define END_STRING 0xff
#define MAX7456ADD_VM0 0x00 //0b0011100// 00 // 00 ,0011100
#define MAX7456ADD_VM1 0x01
@ -142,17 +141,17 @@
enum VIDEO_TYPES { AUTO = 0, PAL, NTSC };
extern uint16_t max_screen_size;
extern uint16_t maxScreenSize;
void max7456_init(uint8_t system);
void max7456_draw_screen(void);
void max7456_write_string(const char *string, int16_t address);
void max7456_write_nvm(uint8_t char_address, uint8_t *font_data);
uint8_t max7456_get_rows_count(void);
void max7456_write(uint8_t x, uint8_t y, char *buff);
void max7456_write_char(uint8_t x, uint8_t y, uint8_t c);
void max7456_clear_screen(void);
void max7456_refresh_all(void);
void max7456_init(uint8_t system);
void max7456_draw_screen(void);
void max7456_write_string(const char *string, int16_t address);
void max7456_write_nvm(uint8_t char_address, uint8_t *font_data);
uint8_t max7456_get_rows_count(void);
void max7456_write(uint8_t x, uint8_t y, char *buff);
void max7456_write_char(uint8_t x, uint8_t y, uint8_t c);
void max7456_clear_screen(void);
void max7456_refresh_all(void);
uint8_t* max7456_get_screen_buffer(void);
#ifdef MAX7456_DMA_CHANNEL_TX

View File

@ -36,29 +36,29 @@
// Direction arrows
#define SYM_ARROW_SOUTH 0x60
#define SYM_ARROW_2 0x61
#define SYM_ARROW_3 0x62
#define SYM_ARROW_4 0x63
#define SYM_ARROW_EAST 0x64
#define SYM_ARROW_6 0x65
#define SYM_ARROW_7 0x66
#define SYM_ARROW_8 0x67
#define SYM_ARROW_2 0x61
#define SYM_ARROW_3 0x62
#define SYM_ARROW_4 0x63
#define SYM_ARROW_EAST 0x64
#define SYM_ARROW_6 0x65
#define SYM_ARROW_7 0x66
#define SYM_ARROW_8 0x67
#define SYM_ARROW_NORTH 0x68
#define SYM_ARROW_10 0x69
#define SYM_ARROW_11 0x6A
#define SYM_ARROW_12 0x6B
#define SYM_ARROW_WEST 0x6C
#define SYM_ARROW_14 0x6D
#define SYM_ARROW_15 0x6E
#define SYM_ARROW_16 0x6F
#define SYM_ARROW_10 0x69
#define SYM_ARROW_11 0x6A
#define SYM_ARROW_12 0x6B
#define SYM_ARROW_WEST 0x6C
#define SYM_ARROW_14 0x6D
#define SYM_ARROW_15 0x6E
#define SYM_ARROW_16 0x6F
// Heading Graphics
#define SYM_HEADING_N 0x18
#define SYM_HEADING_S 0x19
#define SYM_HEADING_E 0x1A
#define SYM_HEADING_W 0x1B
#define SYM_HEADING_DIVIDED_LINE 0x1C
#define SYM_HEADING_LINE 0x1D
#define SYM_HEADING_N 0x18
#define SYM_HEADING_S 0x19
#define SYM_HEADING_E 0x1A
#define SYM_HEADING_W 0x1B
#define SYM_HEADING_DIVIDED_LINE 0x1C
#define SYM_HEADING_LINE 0x1D
// FRSKY HUB
#define SYM_CELL0 0xF0
@ -93,63 +93,60 @@
#define SYM_ALT 0xCC
// GPS Mode and Autopilot
#define SYM_3DFIX 0xDF
#define SYM_HOLD 0xEF
#define SYM_G_HOME 0xFF
#define SYM_GHOME 0x9D
#define SYM_GHOME1 0x9E
#define SYM_GHOLD 0xCD
#define SYM_GHOLD1 0xCE
#define SYM_GMISSION 0xB5
#define SYM_3DFIX 0xDF
#define SYM_HOLD 0xEF
#define SYM_G_HOME 0xFF
#define SYM_GHOME 0x9D
#define SYM_GHOME1 0x9E
#define SYM_GHOLD 0xCD
#define SYM_GHOLD1 0xCE
#define SYM_GMISSION 0xB5
#define SYM_GMISSION1 0xB6
#define SYM_GLAND 0xB7
#define SYM_GLAND1 0xB8
#define SYM_GLAND 0xB7
#define SYM_GLAND1 0xB8
// Gimbal active Mode
#define SYM_GIMBAL 0x16
#define SYM_GIMBAL 0x16
#define SYM_GIMBAL1 0x17
// Sensor´s Presence
#define SYM_ACC 0xA0
#define SYM_MAG 0xA1
#define SYM_BAR 0xA2
#define SYM_GPS 0xA3
#define SYM_MAN 0xC0
#define SYM_MAN1 0xC1
#define SYM_MAN2 0xC2
#define SYM_CHECK 0xBE
#define SYM_BARO10 0xB7
#define SYM_BARO11 0xB8
#define SYM_MAG10 0xB5
#define SYM_MAG11 0xB6
#define SYM_ACC 0xA0
#define SYM_MAG 0xA1
#define SYM_BAR 0xA2
#define SYM_GPS 0xA3
#define SYM_MAN 0xC0
#define SYM_MAN1 0xC1
#define SYM_MAN2 0xC2
#define SYM_CHECK 0xBE
#define SYM_BARO10 0xB7
#define SYM_BARO11 0xB8
#define SYM_MAG10 0xB5
#define SYM_MAG11 0xB6
// AH Center screen Graphics
#define SYM_AH_CENTER_LINE 0x26
#define SYM_AH_CENTER_LINE_RIGHT 0x27
#define SYM_AH_CENTER 0x7E
#define SYM_AH_RIGHT 0x02
#define SYM_AH_LEFT 0x03
#define SYM_AH_DECORATION_UP 0xC9
#define SYM_AH_DECORATION_DOWN 0xCF
#define SYM_AH_CENTER_LINE 0x26
#define SYM_AH_CENTER_LINE_RIGHT 0x27
#define SYM_AH_CENTER 0x7E
#define SYM_AH_RIGHT 0x02
#define SYM_AH_LEFT 0x03
#define SYM_AH_DECORATION_UP 0xC9
#define SYM_AH_DECORATION_DOWN 0xCF
// AH Bars
#define SYM_AH_BAR9_0 0x80
// Temperature
#define SYM_TEMP_F 0x0D
#define SYM_TEMP_C 0x0E
// Batt evolution
#define SYM_BATT_FULL 0x90
#define SYM_BATT_5 0x91
#define SYM_BATT_4 0x92
#define SYM_BATT_3 0x93
#define SYM_BATT_2 0x94
#define SYM_BATT_1 0x95
#define SYM_BATT_EMPTY 0x96
#define SYM_BATT_FULL 0x90
#define SYM_BATT_5 0x91
#define SYM_BATT_4 0x92
#define SYM_BATT_3 0x93
#define SYM_BATT_2 0x94
#define SYM_BATT_1 0x95
#define SYM_BATT_EMPTY 0x96
// Vario
#define SYM_VARIO 0x7F
@ -159,41 +156,41 @@
// Batt Icon´s
#define SYM_MAIN_BATT 0x97
#define SYM_VID_BAT 0xBF
#define SYM_VID_BAT 0xBF
// Unit Icon´s (Metric)
#define SYM_MS 0x9F
#define SYM_KMH 0xA5
#define SYM_ALTM 0xA7
#define SYM_DISTHOME_M 0xBB
#define SYM_M 0x0C
#define SYM_MS 0x9F
#define SYM_KMH 0xA5
#define SYM_ALTM 0xA7
#define SYM_DISTHOME_M 0xBB
#define SYM_M 0x0C
// Unit Icon´s (Imperial)
#define SYM_FTS 0x99
#define SYM_MPH 0xA6
#define SYM_ALTFT 0xA8
#define SYM_FTS 0x99
#define SYM_MPH 0xA6
#define SYM_ALTFT 0xA8
#define SYM_DISTHOME_FT 0xB9
#define SYM_FT 0x0F
#define SYM_FT 0x0F
// Voltage and amperage
#define SYM_VOLT 0x06
#define SYM_AMP 0x9A
#define SYM_MAH 0x07
#define SYM_WATT 0x57
#define SYM_VOLT 0x06
#define SYM_AMP 0x9A
#define SYM_MAH 0x07
#define SYM_WATT 0x57
// Flying Mode
#define SYM_ACRO 0xAE
#define SYM_ACROGY 0x98
#define SYM_ACRO1 0xAF
#define SYM_STABLE 0xAC
#define SYM_STABLE1 0xAD
#define SYM_HORIZON 0xC4
#define SYM_HORIZON1 0xC5
#define SYM_PASS 0xAA
#define SYM_PASS1 0xAB
#define SYM_AIR 0xEA
#define SYM_AIR1 0xEB
#define SYM_PLUS 0x89
#define SYM_ACRO 0xAE
#define SYM_ACROGY 0x98
#define SYM_ACRO1 0xAF
#define SYM_STABLE 0xAC
#define SYM_STABLE1 0xAD
#define SYM_HORIZON 0xC4
#define SYM_HORIZON1 0xC5
#define SYM_PASS 0xAA
#define SYM_PASS1 0xAB
#define SYM_AIR 0xEA
#define SYM_AIR1 0xEB
#define SYM_PLUS 0x89
// Note, these change with scrolling enabled (scrolling is TODO)
//#define SYM_AH_DECORATION_LEFT 0x13
@ -201,14 +198,14 @@
#define SYM_AH_DECORATION 0x13
// Time
#define SYM_ON_M 0x9B
#define SYM_ON_M 0x9B
#define SYM_FLY_M 0x9C
#define SYM_ON_H 0x70
#define SYM_ON_H 0x70
#define SYM_FLY_H 0x71
// Throttle Position (%)
#define SYM_THR 0x04
#define SYM_THR1 0x05
#define SYM_THR 0x04
#define SYM_THR1 0x05
// RSSI
#define SYM_RSSI 0x01
@ -223,4 +220,4 @@
#define SYM_MIN 0xB3
#define SYM_AVG 0xB4
#endif
#endif // USE_MAX7456

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,20 @@
/*
* This file is part of Cleanflight.
*
* Cleanflight is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Cleanflight is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
@ -27,29 +44,25 @@ typedef enum {
} osd_unit_t;
typedef struct {
uint16_t item_pos[OSD_MAX_ITEMS];
//alarms
uint8_t rssi_alarm;
uint16_t cap_alarm;
uint16_t time_alarm;
uint16_t alt_alarm;
uint16_t item_pos[OSD_MAX_ITEMS];
uint8_t video_system;
// Alarms
uint8_t rssi_alarm;
uint16_t cap_alarm;
uint16_t time_alarm;
uint16_t alt_alarm;
uint8_t video_system;
osd_unit_t units;
} osd_profile;
} osd_profile_t;
typedef struct {
int16_t max_speed;
int16_t min_voltage; // /10
int16_t max_current; // /10
int16_t min_rssi;
} tStatistic;
int16_t max_speed;
int16_t min_voltage; // /10
int16_t max_current; // /10
int16_t min_rssi;
} statistic_t;
void osdInit(void);
void OSD_Update(uint8_t guiKey);
void OSD_OpenMenu(void);
void OSD_HandleGui(uint8_t cmd);
void OSD_ResetSettings(void);
void OSD_Message(char *line1, char *line2, uint8_t timeout);
void resetOsdConfig(osd_profile *osdProfile);
void resetOsdConfig(osd_profile_t *osdProfile);
void updateOsd(void);