diff --git a/src/frsky.cpp b/src/frsky.cpp index a8693fb31..e67b5628b 100644 --- a/src/frsky.cpp +++ b/src/frsky.cpp @@ -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) { diff --git a/src/frsky.h b/src/frsky.h index 14d00588a..dbfe2f059 100644 --- a/src/frsky.h +++ b/src/frsky.h @@ -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) diff --git a/src/myeeprom.h b/src/myeeprom.h index 288f883b3..a5586f4d6 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -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; diff --git a/src/open9x.cpp b/src/open9x.cpp index 653ff568d..9d560b83d 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -690,7 +690,7 @@ int16_t getValue(uint8_t i) else if(iBSRRL = 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 diff --git a/src/x9d/lcd_driver.cpp b/src/x9d/lcd_driver.cpp index 01d2ec8ee..595953c15 100644 --- a/src/x9d/lcd_driver.cpp +++ b/src/x9d/lcd_driver.cpp @@ -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>3)*LCD_W]; uint8_t mask = (1 << (y%8)); + Set_Address(0, y); AspiCmd(0xAF); - for (uint8_t x=0; x