Show calibration confirmation in GUI

This commit is contained in:
PaulStoffregen 2018-01-23 08:47:41 -08:00
commit 3e24361d18
7 changed files with 132 additions and 9 deletions

View file

@ -61,13 +61,14 @@ MAKEFLAGS = --jobs=12
endif
OBJS = visualize.o serialdata.o rawdata.o magcal.o matrix.o fusion.o quality.o mahony.o
IMGS = checkgreen.png checkempty.png checkemptygray.png
all: $(ALL)
MotionCal: gui.o portlist.o $(OBJS)
MotionCal: gui.o portlist.o images.o $(OBJS)
$(CXX) $(SFLAG) $(CFLAGS) $(LDFLAGS) -o $@ $^ `$(WXCONFIG) --libs all,opengl`
MotionCal.exe: resource.o gui.o portlist.o $(OBJS)
MotionCal.exe: resource.o gui.o portlist.o images.o $(OBJS)
$(CXX) $(SFLAG) $(CFLAGS) $(LDFLAGS) -o $@ $^ `$(WXCONFIG) --libs all,opengl`
-pjrcwinsigntool $@
-./cp_windows.sh $@
@ -75,6 +76,9 @@ MotionCal.exe: resource.o gui.o portlist.o $(OBJS)
resource.o: resource.rc icon.ico
$(WINDRES) $(WXFLAGS) -o resource.o resource.rc
images.cpp: $(IMGS) png2c.pl
perl png2c.pl $(IMGS) > images.cpp
MotionCal.app: MotionCal Info.plist icon.icns
mkdir -p $@/Contents/MacOS
mkdir -p $@/Contents/Resources/English.lproj
@ -94,7 +98,7 @@ imuread: imuread.o $(OBJS)
$(CC) -s $(CFLAGS) $(LDFLAGS) -o $@ $^ $(CLILIBS)
clean:
rm -f gui MotionCal imuread *.o *.exe *.sign?
rm -f gui MotionCal imuread *.o *.exe *.sign? images.cpp
rm -rf MotionCal.app MotionCal.dmg .DS_Store dmg_tmpdir
gui.o: gui.cpp gui.h imuread.h Makefile

BIN
checkempty.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 953 B

BIN
checkemptygray.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 943 B

BIN
checkgreen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

32
gui.cpp
View file

@ -3,6 +3,7 @@
wxString port_name;
static bool show_calibration_confirmed = false;
wxBEGIN_EVENT_TABLE(MyCanvas, wxGLCanvas)
@ -132,6 +133,13 @@ MyFrame::MyFrame(wxWindow *parent, wxWindowID id, const wxString &title,
m_button_sendcal = new wxButton(panel, ID_SENDCAL_BUTTON, "Send Cal");
vsizer->Add(m_button_sendcal, 1, wxEXPAND, 0);
m_button_sendcal->Enable(false);
vsizer->AddSpacer(16);
text = new wxStaticText(panel, wxID_ANY, "Status");
vsizer->Add(text, 0, wxTOP|wxBOTTOM, 4);
wxImage::AddHandler(new wxPNGHandler);
//m_confirm_icon = new wxStaticBitmap(panel, ID_CONFIRM_ICON, MyBitmap("checkgreen.png"));
m_confirm_icon = new wxStaticBitmap(panel, wxID_ANY, MyBitmap("checkemptygray.png"));
vsizer->Add(m_confirm_icon, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, 0);
vsizer = new wxBoxSizer(wxVERTICAL);
middlesizer->Add(vsizer, 1, wxEXPAND | wxALL, 8);
@ -257,11 +265,17 @@ void MyFrame::OnTimer(wxTimerEvent &event)
wobble = quality_wobble_error();
fiterror = quality_spherical_fit_error();
if (gaps < 15.0f && variance < 4.5f && wobble < 4.0f && fiterror < 5.0f) {
m_sendcal_menu->Enable(ID_SENDCAL_MENU, true);
m_button_sendcal->Enable(true);
if (!m_sendcal_menu->IsEnabled(ID_SENDCAL_MENU) || !m_button_sendcal->IsEnabled()) {
m_sendcal_menu->Enable(ID_SENDCAL_MENU, true);
m_button_sendcal->Enable(true);
m_confirm_icon->SetBitmap(MyBitmap("checkempty.png"));
}
} else if (gaps > 20.0f && variance > 5.0f && wobble > 5.0f && fiterror > 6.0f) {
m_sendcal_menu->Enable(ID_SENDCAL_MENU, false);
m_button_sendcal->Enable(false);
if (m_sendcal_menu->IsEnabled(ID_SENDCAL_MENU) || m_button_sendcal->IsEnabled()) {
m_sendcal_menu->Enable(ID_SENDCAL_MENU, false);
m_button_sendcal->Enable(false);
m_confirm_icon->SetBitmap(MyBitmap("checkemptygray.png"));
}
}
snprintf(buf, sizeof(buf), "%.1f%%", quality_surface_gap_error());
m_err_coverage->SetLabelText(buf);
@ -297,12 +311,17 @@ void MyFrame::OnTimer(wxTimerEvent &event)
m_sendcal_menu->Enable(ID_SENDCAL_MENU, false);
m_button_clear->Enable(false);
m_button_sendcal->Enable(false);
m_confirm_icon->SetBitmap(MyBitmap("checkemptygray.png"));
m_port_list->Clear();
m_port_list->Append("(none)");
m_port_list->SetSelection(0);
port_name = "";
}
}
if (show_calibration_confirmed) {
m_confirm_icon->SetBitmap(MyBitmap("checkgreen.png"));
show_calibration_confirmed = false;
}
}
void MyFrame::OnClear(wxCommandEvent &event)
@ -322,12 +341,13 @@ void MyFrame::OnSendCal(wxCommandEvent &event)
printf(" %7.2f %6.3f %6.3f %6.3f\n",
magcal.V[2], magcal.invW[2][0], magcal.invW[2][1], magcal.invW[2][2]);
*/
m_confirm_icon->SetBitmap(MyBitmap("checkempty.png"));
send_calibration();
}
void calibration_confirmed(void)
{
// TODO: show GUI indication of calibration written to EEPROM
show_calibration_confirmed = true;
}
@ -407,7 +427,7 @@ void MyFrame::OnAbout(wxCommandEvent &event)
"Paul Stoffregen <paul@pjrc.com>\n"
"http://www.pjrc.com/store/prop_shield.html\n"
"https://github.com/PaulStoffregen/MotionCal\n\n"
"Copyright 2016, PJRC.COM, LLC.",
"Copyright 2018, PJRC.COM, LLC.",
"About MotionCal", wxOK|wxICON_INFORMATION|wxCENTER);
dialog.ShowModal();
}

4
gui.h
View file

@ -79,6 +79,7 @@ private:
wxTimer *m_timer;
wxButton *m_button_clear;
wxButton *m_button_sendcal;
wxStaticBitmap *m_confirm_icon;
wxMenu *m_port_menu;
wxComboBox *m_port_list;
wxMenu *m_sendcal_menu;
@ -108,6 +109,9 @@ private:
// portlist.cpp
wxArrayString serial_port_list();
// images.cpp
wxBitmap MyBitmap(const char *name);
// sample port name, for initial sizing of left panel
#if defined(LINUX)
#define SAMPLE_PORT_NAME "/dev/ttyACM5."

95
png2c.pl Executable file
View file

@ -0,0 +1,95 @@
#! /usr/bin/perl
binmode IN, ":bytes";
$file = $ARGV[0];
print "#include <wx/bitmap.h>\n";
print "#include <wx/image.h>\n";
print "#include <wx/mstream.h>\n";
print "\n";
foreach $file (@ARGV) {
open(IN, $file) or die "Can't open $file: $!\n";
$count = 0;
$len = -s $file;
$filelist[$numfiles] = $file;
$file =~ /^([-_A-Za-z0-9\/]+)/;
$name = "png_$1";
$name =~ s/\//_/g;
$name =~ s/-/_/g;
$size[$numfiles] = $len;
$list[$numfiles++] = $name;
print "static unsigned char ${name}[$len] = \{\n";
while (read(IN, $byte, 1) == 1) {
$n = ord($byte);
printf '0x%02X', $n;
print ',' if $count < $len - 1;
print "\n" if $count++ % 12 == 11;
}
print "\};\n";
close(IN);
}
print "\nstatic const unsigned char *png_image_list[] = {\n";
for ($i=0; $i<$numfiles; $i++) {
print "$list[$i]";
print ',' if $i < $numfiles - 1;
print "\n";
}
print "\};\n";
print "\nstatic const char *png_image_name[] = {\n";
for ($i=0; $i<$numfiles; $i++) {
print "\"$filelist[$i]\"";
print ',' if $i < $numfiles - 1;
print "\n";
}
print "\};\n";
print "\nstatic const unsigned int png_image_size[] = {\n";
for ($i=0; $i<$numfiles; $i++) {
print "$size[$i]";
print ',' if $i < $numfiles - 1;
print "\n";
}
print "\};\n";
print "\nstatic wxBitmap * image_list[] = {\n";
for ($i=0; $i<$numfiles; $i++) {
print "NULL";
print ',' if $i < $numfiles - 1;
print "\n";
}
print "\};\n\n";
print <<EOT;
wxBitmap MyBitmap(size_t index)
{
if (index >= $numfiles || index < 0) return wxNullBitmap;
wxBitmap *p = image_list[index];
if (p) return *p;
wxMemoryInputStream istream(png_image_list[index], png_image_size[index]);
wxImage img(istream, wxBITMAP_TYPE_PNG);
p = new wxBitmap(img);
return *p;
}
wxBitmap MyBitmap(const char *name)
{
for (size_t i=0; i < $numfiles; i++) {
if (strcmp(name, png_image_name[i]) == 0) return MyBitmap(i);
}
return wxNullBitmap;
}
EOT