[X9D] LCD optimizations

[All] FrSky vario V2 (with cm support)
This commit is contained in:
bsongis
2013-01-30 21:51:57 +00:00
parent 6e80e39443
commit 9c5f5c12b6
15 changed files with 75 additions and 75 deletions
+12 -25
View File
@@ -152,10 +152,10 @@ void evalVario(int16_t altitude_bp, uint16_t altitude_ap)
if (varioAltitudeQueuePointer == VARIO_QUEUE_LENGTH)
varioAltitudeQueuePointer = 0;
frskyData.hub.varioAltitudeQueuePointer = varioAltitudeQueuePointer;
frskyData.varioSpeed -= frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] ;
frskyData.hub.varioSpeed -= frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] ;
frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] = varioAltitude_cm - frskyData.hub.varioAltitude_cm;
frskyData.hub.varioAltitude_cm = varioAltitude_cm;
frskyData.varioSpeed += frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] ;
frskyData.hub.varioSpeed += frskyData.hub.varioAltitudeQueue[varioAltitudeQueuePointer] ;
#endif
}
@@ -181,7 +181,7 @@ void parseTelemHubByte(uint8_t byte)
return;
}
if (state == TS_DATA_ID) {
if (byte > 0x3b) {
if (byte > 0x3f) {
state = TS_IDLE;
}
else {
@@ -258,7 +258,7 @@ void parseTelemHubByte(uint8_t byte)
// First received barometer altitude => Altitude offset
if (!frskyData.hub.baroAltitudeOffset)
frskyData.hub.baroAltitudeOffset = -frskyData.hub.baroAltitude_bp;
if (g_model.frsky.varioSource == VARIO_SOURCE_DATA) {
if (g_model.frsky.varioSource == VARIO_SOURCE_ALTI_V1) {
evalVario(frskyData.hub.baroAltitude_bp, 0);
}
frskyData.hub.baroAltitude_bp += frskyData.hub.baroAltitudeOffset;
@@ -266,7 +266,7 @@ void parseTelemHubByte(uint8_t byte)
break;
case offsetof(FrskyHubData, baroAltitude_ap):
if (g_model.frsky.varioSource == VARIO_SOURCE_HALCYON) {
if (g_model.frsky.varioSource == VARIO_SOURCE_ALTI_V2) {
evalVario(frskyData.hub.baroAltitude_bp-frskyData.hub.baroAltitudeOffset, frskyData.hub.baroAltitude_ap);
}
break;
@@ -335,7 +335,7 @@ void parseTelemWSHowHighByte(uint8_t byte)
if (frskyUsrStreaming < (FRSKY_TIMEOUT10ms*3 - 10)) {
((uint8_t*)&frskyData.hub)[offsetof(FrskyHubData, baroAltitude_bp)] = byte;
checkMinMaxAltitude();
if (g_model.frsky.varioSource == VARIO_SOURCE_DATA) {
if (g_model.frsky.varioSource == VARIO_SOURCE_ALTI_V1) {
evalVario(frskyData.hub.baroAltitude_bp, 0);
}
}
@@ -348,19 +348,6 @@ void parseTelemWSHowHighByte(uint8_t byte)
}
#endif
/*
Called from somewhere in the main loop or a low priority interrupt
routine perhaps. This function processes FrSky telemetry data packets
assembled by he USART0_RX_vect) ISR function (below) and stores
extracted data in global variables for use by other parts of the program.
Packets can be any of the following:
- A1/A2/RSSI telemetry data
- Alarm level/mode/threshold settings for Ch1A, Ch1B, Ch2A, Ch2B
- User Data packets
*/
void processFrskyPacket(uint8_t *packet)
{
// What type of packet?
@@ -376,7 +363,7 @@ void processFrskyPacket(uint8_t *packet)
frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected
uint8_t varioSource = g_model.frsky.varioSource - VARIO_SOURCE_A1;
if (varioSource < 2)
frskyData.varioSpeed = applyChannelRatio(varioSource, frskyData.analog[varioSource].value);
frskyData.hub.varioSpeed = applyChannelRatio(varioSource, frskyData.analog[varioSource].value);
break;
}
#if defined(FRSKY_HUB) || defined (WS_HOW_HIGH)
@@ -782,16 +769,16 @@ NOINLINE void check_frsky()
do {
int16_t verticalSpeed;
int16_t varioCenterMax = (int16_t)g_model.frsky.varioCenterMax * 10 + 50;
if (frskyData.varioSpeed >= varioCenterMax) {
verticalSpeed = frskyData.varioSpeed - varioCenterMax;
if (frskyData.hub.varioSpeed >= varioCenterMax) {
verticalSpeed = frskyData.hub.varioSpeed - varioCenterMax;
int16_t varioMax = (10+(int16_t)g_model.frsky.varioMax) * 100;
if (verticalSpeed > varioMax) verticalSpeed = varioMax;
verticalSpeed = (verticalSpeed * 10) / ((varioMax-varioCenterMax) / 100);
}
else {
int16_t varioCenterMin = (int16_t)g_model.frsky.varioCenterMin * 10 - 50;
if (frskyData.varioSpeed <= varioCenterMin) {
verticalSpeed = frskyData.varioSpeed - varioCenterMin;
if (frskyData.hub.varioSpeed <= varioCenterMin) {
verticalSpeed = frskyData.hub.varioSpeed - varioCenterMin;
int16_t varioMin = (-10+(int16_t)g_model.frsky.varioMin) * 100;
if (verticalSpeed < varioMin) verticalSpeed = varioMin;
verticalSpeed = (verticalSpeed * 10) / ((varioCenterMin-varioMin) / 100);
@@ -811,7 +798,7 @@ NOINLINE void check_frsky()
} while(0);
#else
int8_t verticalSpeed = limit((int16_t)-100, (int16_t)(frskyData.varioSpeed/10), (int16_t)+100);
int8_t verticalSpeed = limit((int16_t)-100, (int16_t)(frskyData.hub.varioSpeed/10), (int16_t)+100);
uint16_t interval;
if (verticalSpeed == 0) {
+2 -1
View File
@@ -134,8 +134,10 @@ PACK(struct FrskyHubData {
int16_t gpsAltitudeOffset;
uint8_t varioAltitudeQueuePointer; // circular-buffer pointer
uint8_t minCellIdx;
int16_t varioSpeed; // 0x3F Added to FrSky protocol for home made varios
uint16_t cellsSum;
uint16_t vfas;
// TODO later uint16_t minVfas;
});
@@ -159,7 +161,6 @@ struct FrskyData {
uint16_t currentConsumption;
uint16_t currentPrescale;
uint16_t power;
int16_t varioSpeed;
};
#if defined(FRSKY_HUB)
+6 -5
View File
@@ -448,11 +448,12 @@ enum TelemetrySource {
enum VarioSource {
VARIO_SOURCE_FIRST = 0,
VARIO_SOURCE_DATA = VARIO_SOURCE_FIRST,
VARIO_SOURCE_ALTI_V1 = VARIO_SOURCE_FIRST,
VARIO_SOURCE_ALTI_V2,
VARIO_SOURCE_VARIO,
VARIO_SOURCE_A1,
VARIO_SOURCE_A2,
VARIO_SOURCE_HALCYON,
VARIO_SOURCE_LAST = VARIO_SOURCE_HALCYON,
VARIO_SOURCE_LAST = VARIO_SOURCE_A2
};
PACK(typedef struct t_FrSkyBarData {
@@ -510,12 +511,12 @@ PACK(typedef struct t_FrSkyData {
uint8_t usrProto:2; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh, 3=Halcyon
uint8_t blades:2; // How many blades for RPMs, 0=2 blades, 1=3 blades
uint8_t screensType:2;
uint8_t varioSource:2;
uint8_t voltsSource:2;
int8_t varioMin:4;
int8_t varioMax:4;
FrSkyRSSIAlarm rssiAlarms[2];
FrSkyScreenData screens[MAX_FRSKY_SCREENS];
uint8_t voltsSource:3;
uint8_t varioSource:3;
int8_t varioCenterMin:5;
uint8_t currentSource:3;
int8_t varioCenterMax:5;
+1 -1
View File
@@ -690,7 +690,7 @@ int16_t getValue(uint8_t i)
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCy) return frskyData.hub.accelY;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCz) return frskyData.hub.accelZ;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_HDG) return frskyData.hub.gpsCourse_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_VSPD) return frskyData.varioSpeed;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_VSPD) return frskyData.hub.varioSpeed;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A1) return frskyData.analog[0].min;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A2) return frskyData.analog[1].min;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MAX_CURRENT) return *(((int16_t*)(&frskyData.hub.minAltitude))+i-(CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_ALT-1));
+2 -2
View File
@@ -172,8 +172,8 @@
#define LEN_VOLTSRC "\003"
#define TR_VOLTSRC "---""A1\0""A2\0""FAS""Cel"
#define LEN_VARIOSRC "\005"
#define TR_VARIOSRC "FrSky\0 ""A1\0 ""A2\0 ""Halcyon"
#define LEN_VARIOSRC "\005"
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#define LEN_VSCREEN "\010"
#define TR_VSCREEN "Hodnota ""Ukazatel"
+2 -2
View File
@@ -173,8 +173,8 @@
#define LEN_VOLTSRC "\003"
#define TR_VOLTSRC "---""A1\0""A2\0""FAS""Cel"
#define LEN_VARIOSRC "\007"
#define TR_VARIOSRC "FrSky\0 ""A1\0 ""A2\0 ""Halcyon"
#define LEN_VARIOSRC "\005"
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Wert""Str."
+2 -2
View File
@@ -187,8 +187,8 @@
#define LEN_VOLTSRC "\003"
#define TR_VOLTSRC "---""A1\0""A2\0""FAS""Cel"
#define LEN_VARIOSRC "\007"
#define TR_VARIOSRC "FrSky\0 ""A1\0 ""A2\0 ""Halcyon"
#define LEN_VARIOSRC "\005"
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Nums""Bars"
+2 -2
View File
@@ -165,8 +165,8 @@
#define LEN_VOLTSRC "\003"
#define TR_VOLTSRC "---""A1\0""A2\0""FAS""Cel"
#define LEN_VARIOSRC "\007"
#define TR_VARIOSRC "FrSky\0 ""A1\0 ""A2\0 ""Halcyon"
#define LEN_VARIOSRC "\005"
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Nums""Bars"
+2 -2
View File
@@ -173,8 +173,8 @@
#define LEN_VOLTSRC "\003"
#define TR_VOLTSRC "---""A1\0""A2\0""FAS""Cel"
#define LEN_VARIOSRC "\007"
#define TR_VARIOSRC "FrSky\0 ""A1\0 ""A2\0 ""Halcyon"
#define LEN_VARIOSRC "\005"
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Val.""Bars"
+2 -2
View File
@@ -171,8 +171,8 @@
#define LEN_VOLTSRC "\003"
#define TR_VOLTSRC "---""A1\0""A2\0""FAS""Cel"
#define LEN_VARIOSRC "\007"
#define TR_VARIOSRC "FrSky\0 ""A1\0 ""A2\0 ""Halcyon"
#define LEN_VARIOSRC "\005"
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Nums""Bars"
+2 -2
View File
@@ -173,8 +173,8 @@
#define LEN_VOLTSRC "\003"
#define TR_VOLTSRC "---""A1\0""A2\0""FAS""Cel"
#define LEN_VARIOSRC "\007"
#define TR_VARIOSRC "FrSky\0 ""A1\0 ""A2\0 ""Halcyon"
#define LEN_VARIOSRC "\005"
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Nums""Bars"
+2 -2
View File
@@ -173,8 +173,8 @@
#define LEN_VOLTSRC "\003"
#define TR_VOLTSRC "---""A1\0""A2\0""FAS""Cel"
#define LEN_VARIOSRC "\007"
#define TR_VARIOSRC "FrSky\0 ""A1\0 ""A2\0 ""Halcyon"
#define LEN_VARIOSRC "\005"
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Nums""Bars"
-2
View File
@@ -12,8 +12,6 @@
#include "../open9x.h"
#define __no_operation __NOP
/**
**********send command to lcd**************
*/
+12 -11
View File
@@ -13,24 +13,25 @@
#include "./STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h"
#define LCD_NCS_HIGH() do{GPIO_SetBits(GPIO_LCD, PIN_LCD_NCS);}while(0)
#define LCD_NCS_LOW() do{GPIO_ResetBits(GPIO_LCD, PIN_LCD_NCS);}while(0)
#define __no_operation __NOP
#define LCD_A0_HIGH() do{GPIO_SetBits(GPIO_LCD, PIN_LCD_A0);}while(0)
#define LCD_A0_LOW() do{GPIO_ResetBits(GPIO_LCD, PIN_LCD_A0);}while(0)
#define LCD_NCS_HIGH() GPIO_LCD->BSRRL = PIN_LCD_NCS
#define LCD_NCS_LOW() GPIO_LCD->BSRRH = PIN_LCD_NCS
#define LCD_RST_HIGH() do{GPIO_SetBits(GPIO_LCD, PIN_LCD_RST);}while(0)
#define LCD_RST_LOW() do{GPIO_ResetBits(GPIO_LCD, PIN_LCD_RST);}while(0)
#define LCD_A0_HIGH() GPIO_LCD->BSRRL = PIN_LCD_A0
#define LCD_A0_LOW() GPIO_LCD->BSRRH = PIN_LCD_A0
#define LCD_CLK_HIGH() do{GPIO_SetBits(GPIO_LCD, PIN_LCD_CLK);}while(0)
#define LCD_CLK_LOW() do{GPIO_ResetBits(GPIO_LCD, PIN_LCD_CLK);}while(0)
#define LCD_RST_HIGH() GPIO_LCD->BSRRL = PIN_LCD_RST
#define LCD_RST_LOW() GPIO_LCD->BSRRH = PIN_LCD_RST
#define LCD_MOSI_HIGH() do{GPIO_SetBits(GPIO_LCD, PIN_LCD_MOSI);}while(0)
#define LCD_MOSI_LOW() do{GPIO_ResetBits(GPIO_LCD, PIN_LCD_MOSI);}while(0)
#define LCD_CLK_HIGH() GPIO_LCD->BSRRL = PIN_LCD_CLK
#define LCD_CLK_LOW() GPIO_LCD->BSRRH = PIN_LCD_CLK
#define LCD_MOSI_HIGH() GPIO_LCD->BSRRL = PIN_LCD_MOSI
#define LCD_MOSI_LOW() GPIO_LCD->BSRRH = PIN_LCD_MOSI
void AspiCmd(u8 Command_Byte);
void AspiData(u8 Para_data);
//u16 spiRegAccess(u8 addrByte, u8 writeValue);
#endif
+26 -14
View File
@@ -26,31 +26,43 @@ void Set_Address(u8 x, u8 y)
#define PALETTE_IDX(p, x, mask) (((p[x] & mask) ? 0x1 : 0) + ((p[DISPLAY_PLAN_SIZE+x] & mask) ? 0x2 : 0) + ((p[2*DISPLAY_PLAN_SIZE+x] & mask) ? 0x4 : 0) + ((p[3*DISPLAY_PLAN_SIZE+x] & mask) ? 0x8 : 0))
const uint8_t lcdPalette[4] = { 0, 0x03, 0x06, 0x0F };
#define LCD_WRITE_BIT(bit) \
if (bit) \
GPIOD->BSRRL = PIN_LCD_MOSI; \
else \
GPIOD->BSRRH = PIN_LCD_MOSI; \
GPIOD->BSRRH = PIN_LCD_CLK; /* Clock low */ \
__no_operation(); \
GPIOD->BSRRL = PIN_LCD_CLK; /* Clock high */
void lcdRefresh()
{
for (uint8_t y=0; y<LCD_H; y++) {
for (uint32_t y=0; y<LCD_H; y++) {
uint8_t *p = &displayBuf[(y>>3)*LCD_W];
uint8_t mask = (1 << (y%8));
Set_Address(0, y);
AspiCmd(0xAF);
for (uint8_t x=0; x<LCD_W; x+=2) {
#if 0
uint8_t data = (p[x] & mask ? 0x80 : 0) + (p[x+1] & mask ? 0x08 : 0) + (p[DISPLAY_PLAN_SIZE+x] & mask ? 0x40 : 0) + (p[DISPLAY_PLAN_SIZE+x+1] & mask ? 0x04 : 0);
#elif 1
uint8_t data = (PALETTE_IDX(p, x, mask) << 4) + (PALETTE_IDX(p, x+1, mask));
//uint8_t data = (lcdPalette(PALETTE_IDX(p, x, mask)) << 4) + lcdPalette(PALETTE_IDX(p, x+1, mask));
#else
// this code shows the 16 grey tones...
uint8_t data = (x * 16) / 212;
data += (data << 4);
#endif
WriteData(data);
LCD_CLK_HIGH();
LCD_A0_HIGH();
LCD_NCS_LOW();
for (uint32_t x=0; x<LCD_W; x++) {
LCD_WRITE_BIT(p[3*DISPLAY_PLAN_SIZE+x] & mask);
LCD_WRITE_BIT(p[2*DISPLAY_PLAN_SIZE+x] & mask);
LCD_WRITE_BIT(p[DISPLAY_PLAN_SIZE+x] & mask);
LCD_WRITE_BIT(p[x] & mask);
}
LCD_NCS_HIGH();
LCD_A0_HIGH();
WriteData(0);
}
}
/**Init the Backlight GPIO */
/* Init the Backlight GPIO */
static void LCD_BL_Config()
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOBL, ENABLE);