47,13 → 47,14 |
#endif |
|
#ifndef NTSC // if NTSC is not thet via makefile |
#define NTSC 0 // set to 1 for NTSC mode + lifts the bottom line |
#define NTSC 1 // set to 1 for NTSC mode + lifts the bottom line |
#endif |
|
#define ARTHORIZON 0 // set to 1 to enable roll&nick artificial horizon |
#define NOOSD 0 // set to 1 to disable OSD completely |
#define NOOSD_BUT_WRN 0 // set to 1 to disable OSD completely but show |
// battery and receive signal warnings |
#define HUD 1 // set to 0 to disable HUD by default |
#define ARTHORIZON 0 // set to 1 to enable roll&nick artificial horizon by default |
#define STATS 1 // set to 1 to enable statistics during motor off by default |
#define WARNINGS 1 // set to 1 to display battery+rc warning even if HUD is disabled |
|
#define UBAT_WRN 94 // voltage for blinking warning, like FC settings |
#define RCLVL_WRN 100 // make the RC level blink if below this number |
|
64,10 → 65,11 |
* FLAGS usable during runtime |
* ##########################################################################*/ |
#define COSD_FLAG_NTSC 1 |
#define COSD_FLAG_ARTHORIZON 2 |
#define COSD_FLAG_NOOSD 4 |
#define COSD_FLAG_NOOSD_BUT_WRN 8 |
#define COSD_ICONS_WRITTEN 16 |
#define COSD_FLAG_HUD 2 |
#define COSD_FLAG_ARTHORIZON 4 |
#define COSD_FLAG_STATS 8 |
#define COSD_FLAG_WARNINGS 16 |
#define COSD_ICONS_WRITTEN 32 |
|
/* ########################################################################## |
* LED controll |
292,6 → 294,40 |
/* ########################################################################## |
* A simple config menu for the flags |
* ##########################################################################*/ |
|
/** |
* helper function for menu updating |
*/ |
void config_menu_drawings(uint8_t chosen) { |
// clear prevoius _cursor_ |
write_ascii_string(3, (chosen + 4) % 5, " "); |
// draw current _cursor_ |
write_ascii_string(3, chosen + 6, ">"); |
if (COSD_FLAGS & COSD_FLAG_HUD) { |
write_ascii_string(23, 6, "ON "); |
} else { |
write_ascii_string(23, 6, "OFF"); |
} |
if (COSD_FLAGS & COSD_FLAG_ARTHORIZON) { |
write_ascii_string(23, 7, "ON "); |
} else { |
write_ascii_string(23, 7, "OFF"); |
} |
if (COSD_FLAGS & COSD_FLAG_STATS) { |
write_ascii_string(23, 8, "ON "); |
} else { |
write_ascii_string(23, 8, "OFF"); |
} |
if (COSD_FLAGS & COSD_FLAG_WARNINGS) { |
write_ascii_string(23, 9, "ON "); |
} else { |
write_ascii_string(23, 9, "OFF"); |
} |
} |
|
/** |
* a simple config menu tryout |
*/ |
void config_menu(void) { |
// disable interrupts (makes the menu more smoothely) |
cli(); |
299,42 → 335,56 |
// clear screen |
clear(); |
|
char* menu[4] = {"Normal OSD ", |
"Art.Horizon ", |
"NO OSD ", |
"NO OSD but WRN "}; |
char* menu[5] = {"Full HUD", |
"Art.Horizon in HUD", |
"Statistics", |
"Warnings", // TODO: do it! |
"EXIT"}; |
|
uint8_t inmenu = 1; |
uint8_t chosen = 0; |
write_ascii_string(10, 4, "Config Menu"); |
|
// clear all mode flags |
COSD_FLAGS &= ~(COSD_FLAG_ARTHORIZON | COSD_FLAG_NOOSD | COSD_FLAG_NOOSD_BUT_WRN); |
write_ascii_string(6, 2, "C-OSD Config Menu"); |
|
// wait a bit before doing stuff so user has chance to release button |
_delay_ms(250); |
|
write_ascii_string(4, 6, menu[0]); |
write_ascii_string(4, 7, menu[1]); |
write_ascii_string(4, 8, menu[2]); |
write_ascii_string(4, 9, menu[3]); |
write_ascii_string(4, 10, menu[4]); |
|
config_menu_drawings(chosen); |
|
while (inmenu) { |
write_ascii_string(2, 7, menu[chosen]); |
if (s2_pressed()) { |
chosen = (chosen + 1) % 4; |
write_ascii_string(3, chosen+6, " "); |
chosen = (chosen + 1) % 5; |
write_ascii_string(3, chosen+6, ">"); |
_delay_ms(500); |
} else if (s1_pressed()) { |
switch (chosen) { |
case 1: // artificial horizon |
COSD_FLAGS |= COSD_FLAG_ARTHORIZON; |
case 0: // full HUD |
COSD_FLAGS ^= COSD_FLAG_HUD; |
config_menu_drawings(chosen); |
break; |
case 2: // everything off |
COSD_FLAGS |= COSD_FLAG_NOOSD; |
case 1: // art horizon |
COSD_FLAGS ^= COSD_FLAG_ARTHORIZON; |
config_menu_drawings(chosen); |
break; |
case 3: // only warning |
COSD_FLAGS |= COSD_FLAG_NOOSD_BUT_WRN; |
case 2: // statistics |
COSD_FLAGS ^= COSD_FLAG_STATS; |
config_menu_drawings(chosen); |
break; |
//default: // normal OSD, so let the flags cleared |
case 3: // warnings |
COSD_FLAGS ^= COSD_FLAG_WARNINGS; |
config_menu_drawings(chosen); |
break; |
case 4: // exit |
inmenu = 0; |
break; |
} |
// leave menu |
inmenu = 0; |
_delay_ms(500); |
_delay_ms(250); |
} |
} |
|
349,18 → 399,18 |
} |
|
#endif // ends !(ALLCHARSDEBUG|(WRITECHARS != -1)) |
|
/* ########################################################################## |
* MAIN |
* ##########################################################################*/ |
int main(void) { |
// set up FLAGS, compiler should flatten this one |
COSD_FLAGS = (NTSC << (COSD_FLAG_NTSC - 1)); |
COSD_FLAGS |= (ARTHORIZON << (COSD_FLAG_ARTHORIZON - 1)); |
COSD_FLAGS |= (NOOSD << (COSD_FLAG_NOOSD - 1)); |
COSD_FLAGS |= (NOOSD_BUT_WRN << (COSD_FLAG_NOOSD_BUT_WRN - 1)); |
// set up FLAGS, compiler should flatten this one |
COSD_FLAGS = (NTSC << 0); |
COSD_FLAGS |= (HUD << 1); |
COSD_FLAGS |= (ARTHORIZON << 2); |
COSD_FLAGS |= (STATS << 3); |
COSD_FLAGS |= (WARNINGS << 4); |
|
// set up Atmega162 Ports |
// set up Atmega162 Ports |
DDRA |= (1 << PA1); // PA1 output (/CS) |
MAX_CS_HIGH |
DDRA |= (1 << PA2); // PA2 output (SDIN) |
384,23 → 434,17 |
DDRC &= ~(1 << PC5); // PC5 input (SET) |
PORTC |= (1 << PC5); // pullup |
|
// set up top and bottom lines |
if (COSD_FLAGS & COSD_FLAG_NTSC) { |
bottom_line = 12; |
} else { |
bottom_line = 14; |
} |
// set up top and bottom lines |
if (COSD_FLAGS & COSD_FLAG_NTSC) { |
bottom_line = 12; |
} else { |
bottom_line = 14; |
} |
|
// reset the MAX7456 to be sure any undefined states do no harm |
// reset the MAX7456 to be sure any undefined states do no harm |
MAX_RESET_LOW |
MAX_RESET_HIGH |
|
// check for keypress at startup |
if (s2_pressed()) { // togle COSD_FLAG_ARTHORIZON |
COSD_FLAGS ^= (1 << (COSD_FLAG_ARTHORIZON - 1)); |
_delay_ms(100); |
} |
|
// give the FC/NC and the maxim time to come up |
LED4_ON |
_delay_ms(2000); |
408,22 → 452,22 |
LED4_OFF |
|
|
//Pushing NEW chars to the MAX7456 |
//Pushing NEW chars to the MAX7456 |
#if (WRITECHARS != -1) |
// DISABLE display (VM0) |
// DISABLE display (VM0) |
spi_send_byte(0x00, 0b00000000); |
#include "characters.c" |
|
#include "characters.c" |
#endif |
|
// Setup Video Mode |
if (COSD_FLAGS & COSD_FLAG_NTSC) { |
// NTSC + enable display immediately (VM0) |
spi_send_byte(0x00, 0b00001000); |
} else { |
// PAL + enable display immediately (VM0) |
spi_send_byte(0x00, 0b01001000); |
} |
// Setup Video Mode |
if (COSD_FLAGS & COSD_FLAG_NTSC) { |
// NTSC + enable display immediately (VM0) |
spi_send_byte(0x00, 0b00001000); |
} else { |
// PAL + enable display immediately (VM0) |
spi_send_byte(0x00, 0b01001000); |
} |
|
// clear all display-mem (DMM) |
spi_send_byte(0x04, 0b00000100); |
481,218 → 525,218 |
clear(); |
write_all_chars(); |
#else |
// clear serial screen |
//usart1_puts("\x1B[2J\x1B[H"); |
//usart1_puts("hello world!\r\n"); |
// clear serial screen |
//usart1_puts("\x1B[2J\x1B[H"); |
//usart1_puts("hello world!\r\n"); |
|
|
// request data ever 100ms from FC |
|
// request data ever 100ms from FC |
//unsigned char ms = 10; |
//sendMKData('d', 0, &ms, 1); |
|
// request OSD Data from NC every 100ms |
|
// request OSD Data from NC every 100ms |
unsigned char ms = 10; |
sendMKData('o', 1, &ms, 1); |
// and disable debug... |
//ms = 0; |
//sendMKData('d', 0, &ms, 1); |
// and disable debug... |
//ms = 0; |
//sendMKData('d', 0, &ms, 1); |
|
// disable TXD-pin |
usart1_DisableTXD(); |
// disable TXD-pin |
usart1_DisableTXD(); |
|
// stats for after flight |
int16_t max_Altimeter = 0; |
uint16_t max_GroundSpeed = 0; |
int16_t max_Distance = 0; |
uint8_t min_UBat = 255; |
uint16_t max_FlyingTime = 0; |
// stats for after flight |
int16_t max_Altimeter = 0; |
uint16_t max_GroundSpeed = 0; |
int16_t max_Distance = 0; |
uint8_t min_UBat = 255; |
uint16_t max_FlyingTime = 0; |
|
// flags from last round to check for changes |
uint8_t old_MKFlags = 0; |
|
// flags from last round to check for changes |
uint8_t old_MKFlags = 0; |
|
char* directions[8] = {"NE", "E ", "SE", "S ", "SW", "W ", "NW", "N "}; |
char arrowdir[8] = { 218, 217, 224, 223, 222, 221, 220, 219}; |
char arrowdir[8] = {218, 217, 224, 223, 222, 221, 220, 219}; |
|
while (1) { |
// write icons at init or after menu/mode-switch |
if (!(COSD_FLAGS & COSD_ICONS_WRITTEN) && !(COSD_FLAGS & COSD_FLAG_NOOSD)) { |
write_char_xy(5, top_line, 203); // km/h |
write_char_xy(10, top_line, 202); // RC-transmitter |
write_char_xy(16, top_line, 208); // degree symbol |
write_char_xy(27, top_line, 204); // small meters m |
write_ascii_string(6, bottom_line, "V"); // voltage |
write_char_xy(14, bottom_line, 209); // on clock |
write_char_xy(22, bottom_line, 210); // fly clock |
write_char_xy(26, bottom_line, 200); // sat1 |
write_char_xy(27, bottom_line, 201); // sat2 |
COSD_FLAGS |= COSD_ICONS_WRITTEN; |
} |
// write icons at init or after menu/mode-switch |
if (!(COSD_FLAGS & COSD_ICONS_WRITTEN) && (COSD_FLAGS & COSD_FLAG_HUD)) { |
write_char_xy(5, top_line, 203); // km/h |
write_char_xy(10, top_line, 202); // RC-transmitter |
write_char_xy(16, top_line, 208); // degree symbol |
write_char_xy(27, top_line, 204); // small meters m |
write_ascii_string(6, bottom_line, "V"); // voltage |
write_char_xy(14, bottom_line, 209); // on clock |
write_char_xy(22, bottom_line, 210); // fly clock |
write_char_xy(26, bottom_line, 200); // sat1 |
write_char_xy(27, bottom_line, 201); // sat2 |
COSD_FLAGS |= COSD_ICONS_WRITTEN; |
} |
if (rxd_buffer_locked) { |
if (!(COSD_FLAGS & COSD_FLAG_NOOSD)) { |
if (rxd_buffer[2] == 'D') { // FC Data |
/*Decode64(); |
debugData = *((DebugOut_t*) pRxData); |
write_number_s(12, 2, RxDataLen); |
write_number_s(20, 2, setsReceived++); |
write_number_s(12, 3, debugData.Analog[0]); // AngleNick |
write_number_s(12, 4, debugData.Analog[1]); // AngleRoll |
if (COSD_FLAGS & COSD_FLAG_HUD) { |
if (rxd_buffer[2] == 'D') { // FC Data |
/*Decode64(); |
debugData = *((DebugOut_t*) pRxData); |
write_number_s(12, 2, RxDataLen); |
write_number_s(20, 2, setsReceived++); |
write_number_s(12, 3, debugData.Analog[0]); // AngleNick |
write_number_s(12, 4, debugData.Analog[1]); // AngleRoll |
write_number_s(12, 5, debugData.Analog[5]); // Height |
write_number_s(12, 6, debugData.Analog[9]); // Voltage |
write_number_s(12, 7, debugData.Analog[10]);// RC Signal |
write_number_s(12, 6, debugData.Analog[9]); // Voltage |
write_number_s(12, 7, debugData.Analog[10]);// RC Signal |
write_number_s(12, 8, debugData.Analog[11]);// Gyro compass*/ |
} else if (rxd_buffer[2] == 'O') { // NC OSD Data |
Decode64(); |
naviData = *((NaviData_t*) pRxData); |
} else if (rxd_buffer[2] == 'O') { // NC OSD Data |
Decode64(); |
naviData = *((NaviData_t*) pRxData); |
|
// first line |
write_3digit_number_u(2, top_line, (uint16_t)(((uint32_t)naviData.GroundSpeed*36)/1000)); |
// first line |
write_3digit_number_u(2, top_line, (uint16_t) (((uint32_t) naviData.GroundSpeed * 36) / 1000)); |
|
write_3digit_number_u(7, top_line, naviData.RC_Quality); |
if (naviData.RC_Quality <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) { |
for (uint8_t x = 0; x < 4; x++) |
write_char_att_xy(7 + x, top_line, BLINK); |
} else if (naviData.RC_Quality > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) { |
for (uint8_t x = 0; x < 4; x++) |
write_char_att_xy(7 + x, top_line, 0); |
} |
last_RC_Quality = naviData.RC_Quality; |
write_3digit_number_u(7, top_line, naviData.RC_Quality); |
if (naviData.RC_Quality <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) { |
for (uint8_t x = 0; x < 4; x++) |
write_char_att_xy(7 + x, top_line, BLINK); |
} else if (naviData.RC_Quality > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) { |
for (uint8_t x = 0; x < 4; x++) |
write_char_att_xy(7 + x, top_line, 0); |
} |
last_RC_Quality = naviData.RC_Quality; |
|
write_3digit_number_u(13, top_line, naviData.CompassHeading); |
write_3digit_number_u(13, top_line, naviData.CompassHeading); |
|
write_ascii_string(17, top_line, directions[heading_conv(naviData.CompassHeading)]); |
write_ascii_string(17, top_line, directions[heading_conv(naviData.CompassHeading)]); |
|
if (naviData.Variometer == 0) { |
write_char_xy(20, top_line, 206); // plain line |
} else if (naviData.Variometer > 0 && naviData.Variometer <= 10) { |
write_char_xy(20, top_line, 234); // small arrow up |
} else if (naviData.Variometer > 10) { |
write_char_xy(20, top_line, 235); // big arrow up |
} else if (naviData.Variometer < 0 && naviData.Variometer >= -10) { |
write_char_xy(20, top_line, 232); // small arrow down |
} else { |
write_char_xy(20, top_line, 233); //big arrow down |
} |
if (naviData.Variometer == 0) { |
write_char_xy(20, top_line, 206); // plain line |
} else if (naviData.Variometer > 0 && naviData.Variometer <= 10) { |
write_char_xy(20, top_line, 234); // small arrow up |
} else if (naviData.Variometer > 10) { |
write_char_xy(20, top_line, 235); // big arrow up |
} else if (naviData.Variometer < 0 && naviData.Variometer >= -10) { |
write_char_xy(20, top_line, 232); // small arrow down |
} else { |
write_char_xy(20, top_line, 233); //big arrow down |
} |
|
// TODO: is this really dm? |
//note:lephisto:according to several sources it's /30 |
//write_number_s(22, top_line, naviData.Altimeter/30); |
if (naviData.Altimeter > 300) { |
// above 10m only write full meters |
write_number_s(22, top_line, naviData.Altimeter/30); |
} else { |
// up to 10m write meters.dm |
write_number_u_10th(21, top_line, naviData.Altimeter/3); |
} |
//note:lephisto:according to several sources it's /30 |
if (naviData.Altimeter > 300) { |
// above 10m only write full meters |
write_number_s(22, top_line, naviData.Altimeter / 30); |
} else { |
// up to 10m write meters.dm |
write_number_u_10th(21, top_line, naviData.Altimeter / 3); |
} |
|
// seccond line |
draw_compass(11, top_line + 1, naviData.CompassHeading); |
// seccond line |
draw_compass(11, top_line + 1, naviData.CompassHeading); |
|
// TODO: verify correctness |
uint16_t heading_home = (naviData.HomePositionDeviation.Bearing + 360 - naviData.CompassHeading) % 360; |
write_char_xy(27, top_line + 1, arrowdir[heading_conv(heading_home)]); |
// TODO: verify correctness |
uint16_t heading_home = (naviData.HomePositionDeviation.Bearing + 360 - naviData.CompassHeading) % 360; |
write_char_xy(27, top_line + 1, arrowdir[heading_conv(heading_home)]); |
|
|
write_number_s(22, top_line + 1, naviData.HomePositionDeviation.Distance/100); |
write_number_s(22, top_line + 1, naviData.HomePositionDeviation.Distance / 100); |
|
// center |
if (naviData.MKFlags & FLAG_MOTOR_RUN) { // should be engines running |
if (!(old_MKFlags & FLAG_MOTOR_RUN)) { // motors just started, clear middle |
clear(); |
// update flags to paint display again if needed |
COSD_FLAGS &= ~COSD_ICONS_WRITTEN; |
} |
if (COSD_FLAGS & COSD_FLAG_ARTHORIZON) { |
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll); |
} |
} else { |
// center |
if (naviData.MKFlags & FLAG_MOTOR_RUN) { // should be engines running |
if (!(old_MKFlags & FLAG_MOTOR_RUN)) { // motors just started, clear middle |
clear(); |
// update flags to paint display again if needed |
COSD_FLAGS &= ~COSD_ICONS_WRITTEN; |
} |
if (COSD_FLAGS & COSD_FLAG_ARTHORIZON) { |
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll); |
} |
} else { |
// stats |
write_ascii_string(2, 5, "max Altitude:"); |
write_number_s(17, 5, max_Altimeter/30); |
write_char_xy(22, 5, 204); // small meters m |
write_ascii_string(2, 6, "max Speed :"); |
write_3digit_number_u(19, 6, (uint16_t)(((uint32_t)max_GroundSpeed*36)/1000)); |
write_char_xy(22, 6, 203); // km/h |
write_ascii_string(2, 7, "max Distance:"); |
write_number_s(17, 7, max_Distance/100); |
write_char_xy(22, 7, 204); // small meters m |
write_ascii_string(2, 8, "min voltage :"); |
//write_number_s(17, 8, min_UBat/10); |
write_number_u_10th(16, 8, min_UBat); |
write_ascii_string(22, 8, "V"); // voltage |
write_ascii_string(2, 9, "max time :"); |
write_time(16, 9, max_FlyingTime); |
write_char_xy(22, 9, 210); // fly clock |
} |
if (COSD_FLAGS & COSD_FLAG_STATS) { |
write_ascii_string(2, 5, "max Altitude:"); |
write_number_s(17, 5, max_Altimeter / 30); |
write_char_xy(22, 5, 204); // small meters m |
write_ascii_string(2, 6, "max Speed :"); |
write_3digit_number_u(19, 6, (uint16_t) (((uint32_t) max_GroundSpeed * 36) / 1000)); |
write_char_xy(22, 6, 203); // km/h |
write_ascii_string(2, 7, "max Distance:"); |
write_number_s(17, 7, max_Distance / 100); |
write_char_xy(22, 7, 204); // small meters m |
write_ascii_string(2, 8, "min voltage :"); |
write_number_u_10th(16, 8, min_UBat); |
write_ascii_string(22, 8, "V"); // voltage |
write_ascii_string(2, 9, "max time :"); |
write_time(16, 9, max_FlyingTime); |
write_char_xy(22, 9, 210); // fly clock |
} else if (COSD_FLAGS & COSD_FLAG_ARTHORIZON) { // if no stats there is space horizon |
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll); |
} |
} |
|
// bottom line |
write_number_u_10th(0, bottom_line, naviData.UBat); |
if (naviData.UBat <= UBAT_WRN && last_UBat > UBAT_WRN) { |
for (uint8_t x = 0; x < 7; x++) |
write_char_att_xy(x, bottom_line, BLINK); |
} else { |
for (uint8_t x = 0; x < 7; x++) |
write_char_att_xy(x, bottom_line, 0); |
} |
// bottom line |
write_number_u_10th(0, bottom_line, naviData.UBat); |
if (naviData.UBat <= UBAT_WRN && last_UBat > UBAT_WRN) { |
for (uint8_t x = 0; x < 7; x++) |
write_char_att_xy(x, bottom_line, BLINK); |
} else { |
for (uint8_t x = 0; x < 7; x++) |
write_char_att_xy(x, bottom_line, 0); |
} |
|
write_time(8, bottom_line, uptime); |
write_time(16, bottom_line, naviData.FlyingTime); |
write_time(8, bottom_line, uptime); |
write_time(16, bottom_line, naviData.FlyingTime); |
|
write_3digit_number_u(23, bottom_line, naviData.SatsInUse); |
write_3digit_number_u(23, bottom_line, naviData.SatsInUse); |
|
if (naviData.NCFlags & NC_FLAG_CH) { |
write_char_xy(27, bottom_line, 231); // gps ch |
} else if (naviData.NCFlags & NC_FLAG_PH) { |
write_char_xy(27, bottom_line, 230); // gps ph |
} else { // (naviData.NCFlags & NC_FLAG_FREE) |
write_char_xy(27, bottom_line, 201); // sat2 (free) |
} |
if (naviData.NCFlags & NC_FLAG_CH) { |
write_char_xy(27, bottom_line, 231); // gps ch |
} else if (naviData.NCFlags & NC_FLAG_PH) { |
write_char_xy(27, bottom_line, 230); // gps ph |
} else { // (naviData.NCFlags & NC_FLAG_FREE) |
write_char_xy(27, bottom_line, 201); // sat2 (free) |
} |
|
//write_number_s(8, 5, RxDataLen); |
//write_number_s(16, 5, setsReceived++); |
//write_number_s(8, 5, RxDataLen); |
//write_number_s(16, 5, setsReceived++); |
|
// remember statistics |
if (naviData.Altimeter > max_Altimeter) max_Altimeter = naviData.Altimeter; |
if (naviData.GroundSpeed > max_GroundSpeed) max_GroundSpeed = naviData.GroundSpeed; |
if (naviData.HomePositionDeviation.Distance > max_Distance) { |
max_Distance = naviData.HomePositionDeviation.Distance; |
} |
if (naviData.UBat < min_UBat) min_UBat = naviData.UBat; |
if (naviData.FlyingTime > max_FlyingTime) max_FlyingTime = naviData.FlyingTime; |
|
old_MKFlags = naviData.MKFlags; |
} // (!(COSD_FLAGS & COSD_FLAG_NOOSD)) |
} |
seconds_since_last_data = 0; |
// remember statistics |
if (naviData.Altimeter > max_Altimeter) max_Altimeter = naviData.Altimeter; |
if (naviData.GroundSpeed > max_GroundSpeed) max_GroundSpeed = naviData.GroundSpeed; |
if (naviData.HomePositionDeviation.Distance > max_Distance) { |
max_Distance = naviData.HomePositionDeviation.Distance; |
} |
if (naviData.UBat < min_UBat) min_UBat = naviData.UBat; |
if (naviData.FlyingTime > max_FlyingTime) max_FlyingTime = naviData.FlyingTime; |
|
old_MKFlags = naviData.MKFlags; |
} |
} |
seconds_since_last_data = 0; |
rxd_buffer_locked = 0; |
} |
// handle keypress |
if (s1_pressed()) { |
//sendMKData('d', 1, (unsigned char*) 0, 1); |
//sendMKData('d', 1, (unsigned char*) 0, 1); |
// request OSD Data from NC every 100ms |
/*unsigned char ms = 10; |
sendMKData('o', 1, &ms, 1); |
_delay_ms(500);*/ |
config_menu(); |
/*unsigned char ms = 10; |
sendMKData('o', 1, &ms, 1); |
_delay_ms(500);*/ |
config_menu(); |
} |
if (s2_pressed()) { |
if (s2_pressed()) { |
uptime = 0; |
_delay_ms(100); |
} |
if (seconds_since_last_data > 2) { |
// re-request OSD Data from NC |
|
// re-enable TXD pin |
usart1_EnableTXD(); |
|
// every 100ms |
unsigned char ms = 10; |
if (seconds_since_last_data > 2) { |
// re-request OSD Data from NC |
|
// re-enable TXD pin |
usart1_EnableTXD(); |
|
// every 100ms |
unsigned char ms = 10; |
sendMKData('o', 1, &ms, 1); |
|
// disable TXD pin again |
usart1_DisableTXD(); |
|
seconds_since_last_data = 0; |
} |
// disable TXD pin again |
usart1_DisableTXD(); |
|
seconds_since_last_data = 0; |
} |
} |
#endif |
return 0; |