Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 382 → Rev 383

/C-OSD/trunk/main.c
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);