237,30 → 237,38 |
} else if (variometer > 0) { // gain height |
switch (variometer / 5){ |
case 0: |
write_char_xy(x, y, 0xba); // smallest arrow up |
//write_char_xy(x, y, 0xba); // smallest arrow up |
write_char_xy(x, y, 0x70); // one arrow up |
break; |
case 1: |
write_char_xy(x, y, 0xb9); // small arrow up |
//write_char_xy(x, y, 0xb9); // small arrow up |
write_char_xy(x, y, 0x71); // two arrows up |
break; |
case 2: |
write_char_xy(x, y, 0xb8); // large arrow up |
//write_char_xy(x, y, 0xb8); // large arrow up |
write_char_xy(x, y, 0x72); // three arrows up |
break; |
default: |
write_char_xy(x, y, 0xb7); // largest arrow up |
//write_char_xy(x, y, 0xb7); // largest arrow up |
write_char_xy(x, y, 0x73); // three black arrows up |
} |
} else { // sink |
switch (variometer / -5){ |
case 0: |
write_char_xy(x, y, 0xbc); // smallest arrow down |
//write_char_xy(x, y, 0xbc); // smallest arrow down |
write_char_xy(x, y, 0x77); // one arrow down |
break; |
case 1: |
write_char_xy(x, y, 0xbd); // small arrow down |
//write_char_xy(x, y, 0xbd); // small arrow down |
write_char_xy(x, y, 0x76); // two arrows down |
break; |
case 2: |
write_char_xy(x, y, 0xbe); // large arrow down |
//write_char_xy(x, y, 0xbe); // large arrow down |
write_char_xy(x, y, 0x75); // three arrows down |
break; |
default: |
write_char_xy(x, y, 0xbf); // largest arrow down |
//write_char_xy(x, y, 0xbf); // largest arrow down |
write_char_xy(x, y, 0x74); // three black arrows down |
} |
} |
} |
384,18 → 392,23 |
*/ |
void config_menu_drawings(uint8_t chosen) { |
// clear prevoius _cursor_ |
write_ascii_string(3, (chosen + 6) % 7, " "); |
write_ascii_string(3, (chosen + 5) % 8, " "); |
// draw current _cursor_ |
write_ascii_string(3, chosen + 6, ">"); |
write_ascii_string(3, chosen + 5, ">"); |
if (COSD_FLAGS & COSD_FLAG_HUD) { |
write_ascii_string_pgm(23, 5, ON); |
} else { |
write_ascii_string_pgm(23, 5, OFF); |
} |
if (COSD_FLAGS & COSD_FLAG_ARTHORIZON) { |
write_ascii_string_pgm(23, 6, ON); |
} else { |
write_ascii_string_pgm(23, 6, OFF); |
write_ascii_string_pgm(23, 6, OFF); |
} |
if (COSD_FLAGS & COSD_FLAG_ARTHORIZON) { |
if (COSD_FLAGS & COSD_FLAG_BIGVARIO) { |
write_ascii_string_pgm(23, 7, ON); |
} else { |
write_ascii_string_pgm(23, 7, OFF); |
write_ascii_string_pgm(23, 7, OFF); |
} |
if (COSD_FLAGS & COSD_FLAG_STATS) { |
write_ascii_string_pgm(23, 8, ON); |
413,9 → 426,9 |
* some sort of clicking response in the menu |
*/ |
void config_menu_doclick(uint8_t chosen, char** menu) { |
write_ascii_string(4, chosen + 6, "DONE "); |
write_ascii_string(4, chosen + 5, "DONE "); |
_delay_ms(1000); |
write_ascii_string(4, chosen + 6, menu[chosen]); |
write_ascii_string(4, chosen + 5, menu[chosen]); |
} |
|
/** |
428,8 → 441,9 |
// clear screen |
clear(); |
|
char* menu[8] = {"Full HUD", |
char* menu[9] = {"Full HUD", |
"Art.Horizon in HUD", |
"Big Vario bar", |
"Statistics", |
"Warnings", // TODO: do it! |
"Reset uptime", |
444,22 → 458,23 |
// 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]); |
write_ascii_string(4, 11, menu[5]); |
write_ascii_string(4, 12, menu[6]); |
write_ascii_string(4, 13, menu[7]); |
write_ascii_string(4, 5, menu[0]); |
write_ascii_string(4, 6, menu[1]); |
write_ascii_string(4, 7, menu[2]); |
write_ascii_string(4, 8, menu[3]); |
write_ascii_string(4, 9, menu[4]); |
write_ascii_string(4, 10, menu[5]); |
write_ascii_string(4, 11, menu[6]); |
write_ascii_string(4, 12, menu[7]); |
write_ascii_string(4, 13, menu[8]); |
|
config_menu_drawings(chosen); |
|
while (inmenu) { |
if (s2_pressed()) { |
write_ascii_string(3, chosen+6, " "); |
chosen = (chosen + 1) % 8; |
write_ascii_string(3, chosen+6, ">"); |
write_ascii_string(3, chosen+5, " "); |
chosen = (chosen + 1) % 9; |
write_ascii_string(3, chosen+5, ">"); |
_delay_ms(500); |
} else if (s1_pressed()) { |
switch (chosen) { |
471,30 → 486,34 |
COSD_FLAGS ^= COSD_FLAG_ARTHORIZON; |
config_menu_drawings(chosen); |
break; |
case 2: // statistics |
case 2: // big vario |
COSD_FLAGS ^= COSD_FLAG_BIGVARIO; |
config_menu_drawings(chosen); |
break; |
case 3: // statistics |
COSD_FLAGS ^= COSD_FLAG_STATS; |
config_menu_drawings(chosen); |
break; |
case 3: // warnings |
case 4: // warnings |
COSD_FLAGS ^= COSD_FLAG_WARNINGS; |
config_menu_drawings(chosen); |
break; |
case 4: // reset uptime |
case 5: // reset uptime |
uptime = 0; |
config_menu_doclick(chosen, menu); |
break; |
case 5: // re-request OSD data |
case 6: // re-request OSD data |
// request OSD Data from NC every 100ms |
usart1_request_mk_data(1, 'o', 100); |
config_menu_doclick(chosen, menu); |
break; |
case 6: // disable debug data |
case 7: // disable debug data |
// disable sending of debug data |
// may result in smoother ddata display |
usart1_request_mk_data(0, 'd', 0); |
config_menu_doclick(chosen, menu); |
break; |
case 7: // exit |
case 8: // exit |
inmenu = 0; |
break; |
} |
521,8 → 540,9 |
COSD_FLAGS = (NTSC << 0); |
COSD_FLAGS |= (HUD << 1); |
COSD_FLAGS |= (ARTHORIZON << 2); |
COSD_FLAGS |= (STATS << 3); |
COSD_FLAGS |= (WARNINGS << 4); |
COSD_FLAGS |= (BIGVARIO << 3); |
COSD_FLAGS |= (STATS << 4); |
COSD_FLAGS |= (WARNINGS << 5); |
|
// set up Atmega162 Ports |
DDRA |= (1 << PA1); // PA1 output (/CS) |
681,7 → 701,10 |
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_char_xy(27, top_line, 204); // small meters m height |
write_char_xy(20, top_line+1, 0xb0); // left circle |
write_char_xy(22, top_line+1, 0xb2); // right circle |
write_char_xy(27, top_line+1, 204); // small meters m home |
//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 |
705,9 → 728,7 |
} else if (rxd_buffer[2] == 'O') { // NC OSD Data |
Decode64(); |
naviData = *((NaviData_t*) pRxData); |
|
draw_big_variometer(27, 8, naviData.Variometer); |
|
|
// first line |
write_ndigit_number_u(2, top_line, (uint16_t) (((uint32_t) naviData.GroundSpeed * (uint32_t)9) / (uint32_t)250), 100, 0); |
|
725,7 → 746,7 |
|
write_ascii_string(17, top_line, directions[heading_conv(naviData.CompassHeading)]); |
|
draw_variometer(20, top_line, naviData.Variometer); |
draw_variometer(21, top_line, naviData.Variometer); |
|
//note:lephisto:according to several sources it's /30 |
if (naviData.Altimeter > 300 || naviData.Altimeter < -300) { |
742,9 → 763,9 |
|
// 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_char_xy(21, top_line + 1, arrowdir[heading_conv(heading_home)]); |
// finer resolution, 0xa0 is first character and we add the index 0 <= index < 16 |
write_char_xy(27, top_line + 1, 0xa0 + heading_fine_conv(heading_home)); |
write_char_xy(21, top_line + 1, 0xa0 + heading_fine_conv(heading_home)); |
|
write_ndigit_number_u(24, top_line + 1, naviData.HomePositionDeviation.Distance / 10, 100, 0); |
|
780,6 → 801,9 |
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll); |
} |
} |
if (COSD_FLAGS & COSD_FLAG_BIGVARIO) { |
draw_big_variometer(27, 8, naviData.Variometer); |
} |
|
// bottom line |
write_ndigit_number_u_10th(2, bottom_line, naviData.UBat, 100, 0); |