Browse Source

AP_OSD: fixed gps stat and messages items, reformat

master
Alexander Malishev 7 years ago committed by Andrew Tridgell
parent
commit
fcd351b5c0
  1. 22
      libraries/AP_OSD/AP_OSD.cpp
  2. 13
      libraries/AP_OSD/AP_OSD.h
  3. 46
      libraries/AP_OSD/AP_OSD_MAX7456.cpp
  4. 2
      libraries/AP_OSD/AP_OSD_MAX7456.h
  5. 50
      libraries/AP_OSD/AP_OSD_Screen.cpp

22
libraries/AP_OSD/AP_OSD.cpp

@ -57,7 +57,7 @@ const AP_Param::GroupInfo AP_OSD::var_info[] = { @@ -57,7 +57,7 @@ const AP_Param::GroupInfo AP_OSD::var_info[] = {
// @Group: 4_
// @Path: AP_OSD_Screen.cpp
AP_SUBGROUPINFO(screen[3], "4_", 6, AP_OSD, AP_OSD_Screen),
AP_GROUPEND
};
@ -116,21 +116,21 @@ void AP_OSD::update_osd() @@ -116,21 +116,21 @@ void AP_OSD::update_osd()
void AP_OSD::update_current_screen()
{
if(rc_channel == 0) {
return;
if (rc_channel == 0) {
return;
}
RC_Channel *channel = RC_Channels::rc_channel(rc_channel-1);
if(channel == nullptr) {
return;
if (channel == nullptr) {
return;
}
int16_t channel_value = channel->get_radio_in();
for(int i=0; i<AP_OSD_NUM_SCREENS; i++){
if(screen[i].enabled && screen[i].channel_min <= channel_value && screen[i].channel_max > channel_value) {
current_screen = i;
break;
}
int16_t channel_value = channel->get_radio_in();
for (int i=0; i<AP_OSD_NUM_SCREENS; i++) {
if (screen[i].enabled && screen[i].channel_min <= channel_value && screen[i].channel_max > channel_value) {
current_screen = i;
break;
}
}
}

13
libraries/AP_OSD/AP_OSD.h

@ -32,7 +32,7 @@ public: @@ -32,7 +32,7 @@ public:
AP_Int8 ypos;
AP_OSD_Setting(bool enabled, uint8_t x, uint8_t y);
// User settable parameters
static const struct AP_Param::GroupInfo var_info[];
};
@ -45,10 +45,13 @@ class AP_OSD_Screen { @@ -45,10 +45,13 @@ class AP_OSD_Screen {
public:
// constructor
AP_OSD_Screen();
void draw(void);
void set_backend(AP_OSD_Backend *_backend) { backend = _backend; };
void set_backend(AP_OSD_Backend *_backend)
{
backend = _backend;
};
// User settable parameters
static const struct AP_Param::GroupInfo var_info[];
@ -68,7 +71,7 @@ private: @@ -68,7 +71,7 @@ private:
AP_OSD_Setting sats{true, 1, 4};
AP_OSD_Setting fltmode{true, 12, 14};
AP_OSD_Setting message{false, 0, 0};
void draw_altitude(uint8_t x, uint8_t y);
void draw_bat_volt(uint8_t x, uint8_t y);
void draw_rssi(uint8_t x, uint8_t y);
@ -98,7 +101,7 @@ public: @@ -98,7 +101,7 @@ public:
OSD_NONE=0,
OSD_MAX7456=1,
};
AP_Int8 osd_type;
AP_Int8 rc_channel;

46
libraries/AP_OSD/AP_OSD_MAX7456.cpp

@ -162,12 +162,12 @@ bool AP_OSD_MAX7456::update_font() @@ -162,12 +162,12 @@ bool AP_OSD_MAX7456::update_font()
for (uint16_t chr=0; chr < 256; chr++) {
const uint8_t* chr_font_data = font_data + chr*NVM_RAM_SIZE;
//check if char already up to date
if(!check_font_char(chr, chr_font_data)) {
//update char inside max7456 NVM
if(!update_font_char(chr, chr_font_data)) {
hal.console->printf("AP_OSD: error during font char update\n");
return false;
}
if (!check_font_char(chr, chr_font_data)) {
//update char inside max7456 NVM
if (!update_font_char(chr, chr_font_data)) {
hal.console->printf("AP_OSD: error during font char update\n");
return false;
}
}
}
hal.console->printf("AP_OSD: osd font is up to date\n");
@ -177,8 +177,8 @@ bool AP_OSD_MAX7456::update_font() @@ -177,8 +177,8 @@ bool AP_OSD_MAX7456::update_font()
//compare char chr inside MAX7456 NVM with font_data
bool AP_OSD_MAX7456::check_font_char(uint8_t chr, const uint8_t* font_data)
{
buffer_offset = 0;
//send request to read data from NVM
buffer_offset = 0;
//send request to read data from NVM
buffer_add_cmd(MAX7456ADD_VM0, 0);
buffer_add_cmd(MAX7456ADD_CMAH, chr);
buffer_add_cmd(MAX7456ADD_CMM, READ_NVR);
@ -186,20 +186,20 @@ bool AP_OSD_MAX7456::check_font_char(uint8_t chr, const uint8_t* font_data) @@ -186,20 +186,20 @@ bool AP_OSD_MAX7456::check_font_char(uint8_t chr, const uint8_t* font_data)
buffer_add_cmd(MAX7456ADD_CMAL, x);
buffer_add_cmd(MAX7456ADD_CMDO, 0xFF);
}
_dev->get_semaphore()->take_blocking();
_dev->transfer(buffer, buffer_offset, buffer, buffer_offset);
_dev->get_semaphore()->give();
//skip response from MAX7456ADD_VM0/MAX7456ADD_CMAH...
buffer_offset = 9;
for (uint16_t x = 0; x < NVM_RAM_SIZE; x++) {
if(buffer[buffer_offset] != font_data[x]) {
return false;
}
//one byte per MAX7456ADD_CMAL/MAX7456ADD_CMDO pair
buffer_offset += 4;
}
return true;
_dev->get_semaphore()->take_blocking();
_dev->transfer(buffer, buffer_offset, buffer, buffer_offset);
_dev->get_semaphore()->give();
//skip response from MAX7456ADD_VM0/MAX7456ADD_CMAH...
buffer_offset = 9;
for (uint16_t x = 0; x < NVM_RAM_SIZE; x++) {
if (buffer[buffer_offset] != font_data[x]) {
return false;
}
//one byte per MAX7456ADD_CMAL/MAX7456ADD_CMDO pair
buffer_offset += 4;
}
return true;
}
bool AP_OSD_MAX7456::update_font_char(uint8_t chr, const uint8_t* font_data)
@ -351,7 +351,7 @@ void AP_OSD_MAX7456::transfer_frame() @@ -351,7 +351,7 @@ void AP_OSD_MAX7456::transfer_frame()
buffer_offset = 0;
for (uint8_t y=0; y<video_lines; y++) {
for (uint8_t x=0; x<video_columns; x++) {
if (frame[y][x] == shadow_frame[y][x] && attr[y][x] == shadow_attr[y][x]) {
continue;
}

2
libraries/AP_OSD/AP_OSD_MAX7456.h

@ -66,7 +66,7 @@ private: @@ -66,7 +66,7 @@ private:
static const uint8_t video_columns = 30;
static const uint8_t max_updated_chars = 64;
static const uint16_t spi_buffer_size = ((max_updated_chars + 1) * 8);
uint8_t frame[video_lines_pal][video_columns];
//frame already transfered to max

50
libraries/AP_OSD/AP_OSD_Screen.cpp

@ -38,37 +38,51 @@ const AP_Param::GroupInfo AP_OSD_Screen::var_info[] = { @@ -38,37 +38,51 @@ const AP_Param::GroupInfo AP_OSD_Screen::var_info[] = {
// @User: Standard
AP_GROUPINFO_FLAGS("ENABLE", 1, AP_OSD_Screen, enabled, 0, AP_PARAM_FLAG_ENABLE),
// @Param: CHAN_MIN
// @DisplayName: Transmitter switch screen minimum pwm
// @Description: This sets the PWM lower limit for this screen
// @Range: 900 2100
// @User: Standard
AP_GROUPINFO("CHAN_MIN", 2, AP_OSD_Screen, channel_min, 900),
// @Param: CHAN_MAX
// @DisplayName: Transmitter switch screen maximum pwm
// @Description: This sets the PWM upper limit for this screen
// @Range: 900 2100
// @User: Standard
AP_GROUPINFO("CHAN_MAX", 3, AP_OSD_Screen, channel_max, 2100),
// @Group: ALTITUDE
// @Path: AP_OSD_Setting.cpp
AP_SUBGROUPINFO(altitude, "ALTITUDE", 2, AP_OSD_Screen, AP_OSD_Setting),
AP_SUBGROUPINFO(altitude, "ALTITUDE", 4, AP_OSD_Screen, AP_OSD_Setting),
// @Group: BATVOLT
// @Path: AP_OSD_Setting.cpp
AP_SUBGROUPINFO(bat_volt, "BAT_VOLS", 3, AP_OSD_Screen, AP_OSD_Setting),
AP_SUBGROUPINFO(bat_volt, "BAT_VOLS", 5, AP_OSD_Screen, AP_OSD_Setting),
// @Group: RSSI
// @Path: AP_OSD_Setting.cpp
AP_SUBGROUPINFO(rssi, "RSSI", 4, AP_OSD_Screen, AP_OSD_Setting),
AP_SUBGROUPINFO(rssi, "RSSI", 6, AP_OSD_Screen, AP_OSD_Setting),
// @Group: CURRENT
// @Path: AP_OSD_Setting.cpp
AP_SUBGROUPINFO(current, "CURRENT", 5, AP_OSD_Screen, AP_OSD_Setting),
AP_SUBGROUPINFO(current, "CURRENT", 7, AP_OSD_Screen, AP_OSD_Setting),
// @Group: BATUSED
// @Path: AP_OSD_Setting.cpp
AP_SUBGROUPINFO(batused, "BATUSED", 6, AP_OSD_Screen, AP_OSD_Setting),
AP_SUBGROUPINFO(batused, "BATUSED", 8, AP_OSD_Screen, AP_OSD_Setting),
// @Group: SATS
// @Path: AP_OSD_Setting.cpp
AP_SUBGROUPINFO(sats, "SATS", 7, AP_OSD_Screen, AP_OSD_Setting),
AP_SUBGROUPINFO(sats, "SATS", 9, AP_OSD_Screen, AP_OSD_Setting),
// @Group: FLTMODE
// @Path: AP_OSD_Setting.cpp
AP_SUBGROUPINFO(fltmode, "FLTMODE", 8, AP_OSD_Screen, AP_OSD_Setting),
AP_SUBGROUPINFO(fltmode, "FLTMODE", 10, AP_OSD_Screen, AP_OSD_Setting),
// @Group: MESSAGE
// @Path: AP_OSD_Setting.cpp
AP_SUBGROUPINFO(message, "MESSAGE", 9, AP_OSD_Screen, AP_OSD_Setting),
AP_SUBGROUPINFO(message, "MESSAGE", 11, AP_OSD_Screen, AP_OSD_Setting),
AP_GROUPEND
};
@ -135,8 +149,7 @@ void AP_OSD_Screen::draw_fltmode(uint8_t x, uint8_t y) @@ -135,8 +149,7 @@ void AP_OSD_Screen::draw_fltmode(uint8_t x, uint8_t y)
void AP_OSD_Screen::draw_sats(uint8_t x, uint8_t y)
{
AP_GPS & gps = AP::gps();
bool has_3dfix = gps.status() <= AP_GPS::GPS_OK_FIX_2D;
backend->write(x, y, !has_3dfix, "%c%c%2d", SYM_SAT_L, SYM_SAT_R, gps.num_sats());
backend->write(x, y, false, "%c%c%2d", SYM_SAT_L, SYM_SAT_R, gps.num_sats());
}
void AP_OSD_Screen::draw_batused(uint8_t x, uint8_t y)
@ -145,13 +158,28 @@ void AP_OSD_Screen::draw_batused(uint8_t x, uint8_t y) @@ -145,13 +158,28 @@ void AP_OSD_Screen::draw_batused(uint8_t x, uint8_t y)
backend->write(x,y, battery.has_failsafed(), "%c%4.0f", SYM_MAH, battery.consumed_mah());
}
char to_uppercase(char c)
{
if (c >= 'a' && c<= 'z') {
return c + 'A' - 'a';
}
return c;
}
void AP_OSD_Screen::draw_message(uint8_t x, uint8_t y)
{
AP_Notify * notify = AP_Notify::instance();
if (notify) {
bool text_is_valid = AP_HAL::millis() - notify->get_text_updated_millis() < 20000;
if (text_is_valid) {
backend->write(x, y, notify->get_text());
char buffer[NOTIFY_TEXT_BUFFER_SIZE];
//converted to uppercase,
//because we do not have small letter chars inside used font
strncpy(buffer, notify->get_text(), sizeof(buffer));
for (int i=0; i<sizeof(buffer); i++) {
buffer[i] = to_uppercase(buffer[i]);
}
backend->write(x, y, buffer);
}
}
}

Loading…
Cancel
Save