From 3e24361d18526e9f568a1284f80b6f9c9cebe3f1 Mon Sep 17 00:00:00 2001 From: PaulStoffregen Date: Tue, 23 Jan 2018 08:47:41 -0800 Subject: [PATCH] Show calibration confirmation in GUI --- Makefile | 10 +++-- checkempty.png | Bin 0 -> 953 bytes checkemptygray.png | Bin 0 -> 943 bytes checkgreen.png | Bin 0 -> 4220 bytes gui.cpp | 32 ++++++++++++--- gui.h | 4 ++ png2c.pl | 95 +++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 132 insertions(+), 9 deletions(-) create mode 100644 checkempty.png create mode 100644 checkemptygray.png create mode 100644 checkgreen.png create mode 100755 png2c.pl diff --git a/Makefile b/Makefile index d9c7390..83a8d7a 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/checkempty.png b/checkempty.png new file mode 100644 index 0000000000000000000000000000000000000000..350179eedcd3819f308d515613156e611f88b036 GIT binary patch literal 953 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 S?41Yz0000Add(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 \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(); } diff --git a/gui.h b/gui.h index 07ab866..64af8ac 100644 --- a/gui.h +++ b/gui.h @@ -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." diff --git a/png2c.pl b/png2c.pl new file mode 100755 index 0000000..d622546 --- /dev/null +++ b/png2c.pl @@ -0,0 +1,95 @@ +#! /usr/bin/perl + +binmode IN, ":bytes"; +$file = $ARGV[0]; + +print "#include \n"; +print "#include \n"; +print "#include \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 <= $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 + + + + + + + + + + +