Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 335 → Rev 336

/C-OSD/trunk/main.c
515,7 → 515,7
 
while (1) {
// write icons at init or after menu/mode-switch
if (!(COSD_FLAGS & COSD_ICONS_WRITTEN)) {
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
528,131 → 528,140
COSD_FLAGS |= COSD_ICONS_WRITTEN;
}
if (rxd_buffer_locked) {
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, 8, debugData.Analog[11]);// Gyro compass*/
} else if (rxd_buffer[2] == 'O') { // NC OSD Data
Decode64();
naviData = *((NaviData_t*) pRxData);
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
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, 8, debugData.Analog[11]);// Gyro compass*/
} 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);
// 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);
}
 
// 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;
// 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);
}
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/10);
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
}
} 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
}
 
// 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;
// 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;
}
old_MKFlags = naviData.MKFlags;
} // (!(COSD_FLAGS & COSD_FLAG_NOOSD))
}
seconds_since_last_data = 0;
rxd_buffer_locked = 0;
}