From a612b5b64821e9468ed0bfe9ed1fefa67e3aad5c Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 15 May 2018 12:19:43 +0200 Subject: [PATCH 01/63] Replacement of xml escape characters when exporting to amf --- xs/src/libslic3r/Format/AMF.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/xs/src/libslic3r/Format/AMF.cpp b/xs/src/libslic3r/Format/AMF.cpp index b446f456b..83b50ec9e 100644 --- a/xs/src/libslic3r/Format/AMF.cpp +++ b/xs/src/libslic3r/Format/AMF.cpp @@ -674,6 +674,33 @@ bool load_amf(const char *path, PresetBundle* bundle, Model *model) return false; } +std::string xml_escape(std::string text) +{ + std::string::size_type pos = 0; + for (;;) + { + pos = text.find_first_of("\"\'&<>", pos); + if (pos == std::string::npos) + break; + + std::string replacement; + switch (text[pos]) + { + case '\"': replacement = """; break; + case '\'': replacement = "'"; break; + case '&': replacement = "&"; break; + case '<': replacement = "<"; break; + case '>': replacement = ">"; break; + default: break; + } + + text.replace(pos, 1, replacement); + pos += replacement.size(); + } + + return text; +} + bool store_amf(const char *path, Model *model, Print* print, bool export_print_config) { if ((path == nullptr) || (model == nullptr) || (print == nullptr)) @@ -701,7 +728,7 @@ bool store_amf(const char *path, Model *model, Print* print, bool export_print_c { std::string config = "\n"; GCode::append_full_config(*print, config); - stream << "" << config << "\n"; + stream << "" << xml_escape(config) << "\n"; } for (const auto &material : model->materials) { From 7645e9cb7a884a4722324b7b5a839424291299fb Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 15 May 2018 14:04:29 +0200 Subject: [PATCH 02/63] Added layer_num, layer_z variables to the end_gcode, end_filament_gcode, added min(.,.), max(.,.) functions to the placeholder parser syntax. --- t/custom_gcode.t | 6 +++- xs/src/libslic3r/GCode.cpp | 19 +++++++----- xs/src/libslic3r/PlaceholderParser.cpp | 41 ++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 8 deletions(-) diff --git a/t/custom_gcode.t b/t/custom_gcode.t index 7c2a75f29..4c1c1b108 100644 --- a/t/custom_gcode.t +++ b/t/custom_gcode.t @@ -1,4 +1,4 @@ -use Test::More tests => 77; +use Test::More tests => 81; use strict; use warnings; @@ -71,6 +71,10 @@ use Slic3r::Test; is $parser->process('{2*foo*(3-12)}'), '0', 'math: 2*foo*(3-12)'; is $parser->process('{2*bar*(3-12)}'), '-36', 'math: 2*bar*(3-12)'; ok abs($parser->process('{2.5*bar*(3-12)}') - -45) < 1e-7, 'math: 2.5*bar*(3-12)'; + is $parser->process('{min(12, 14)}'), '12', 'math: min(12, 14)'; + is $parser->process('{max(12, 14)}'), '14', 'math: max(12, 14)'; + is $parser->process('{min(13.4, -1238.1)}'), '-1238.1', 'math: min(13.4, -1238.1)'; + is $parser->process('{max(13.4, -1238.1)}'), '13.4', 'math: max(13.4, -1238.1)'; # Test the boolean expression parser. is $parser->evaluate_boolean_expression('12 == 12'), 1, 'boolean expression parser: 12 == 12'; diff --git a/xs/src/libslic3r/GCode.cpp b/xs/src/libslic3r/GCode.cpp index dc8e5d691..5e5b74efc 100644 --- a/xs/src/libslic3r/GCode.cpp +++ b/xs/src/libslic3r/GCode.cpp @@ -789,14 +789,19 @@ void GCode::_do_export(Print &print, FILE *file, GCodePreviewData *preview_data) } // Process filament-specific gcode in extruder order. - if (print.config.single_extruder_multi_material) { - // Process the end_filament_gcode for the active filament only. - _writeln(file, this->placeholder_parser_process("end_filament_gcode", print.config.end_filament_gcode.get_at(m_writer.extruder()->id()), m_writer.extruder()->id())); - } else { - for (const std::string &end_gcode : print.config.end_filament_gcode.values) - _writeln(file, this->placeholder_parser_process("end_filament_gcode", end_gcode, (unsigned int)(&end_gcode - &print.config.end_filament_gcode.values.front()))); + { + DynamicConfig config; + config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); + config.set_key_value("layer_z", new ConfigOptionFloat(m_writer.get_position().z - m_config.z_offset.value)); + if (print.config.single_extruder_multi_material) { + // Process the end_filament_gcode for the active filament only. + _writeln(file, this->placeholder_parser_process("end_filament_gcode", print.config.end_filament_gcode.get_at(m_writer.extruder()->id()), m_writer.extruder()->id(), &config)); + } else { + for (const std::string &end_gcode : print.config.end_filament_gcode.values) + _writeln(file, this->placeholder_parser_process("end_filament_gcode", end_gcode, (unsigned int)(&end_gcode - &print.config.end_filament_gcode.values.front(), &config))); + } + _writeln(file, this->placeholder_parser_process("end_gcode", print.config.end_gcode, m_writer.extruder()->id(), &config)); } - _writeln(file, this->placeholder_parser_process("end_gcode", print.config.end_gcode, m_writer.extruder()->id())); _write(file, m_writer.update_progress(m_layer_count, m_layer_count, true)); // 100% _write(file, m_writer.postamble()); diff --git a/xs/src/libslic3r/PlaceholderParser.cpp b/xs/src/libslic3r/PlaceholderParser.cpp index 62b516935..80740b20d 100644 --- a/xs/src/libslic3r/PlaceholderParser.cpp +++ b/xs/src/libslic3r/PlaceholderParser.cpp @@ -414,6 +414,7 @@ namespace client lhs.type = TYPE_BOOL; lhs.data.b = invert ? ! value : value; } + // Compare operators, store the result into lhs. static void equal (expr &lhs, expr &rhs) { compare_op(lhs, rhs, '=', false); } static void not_equal(expr &lhs, expr &rhs) { compare_op(lhs, rhs, '=', true ); } static void lower (expr &lhs, expr &rhs) { compare_op(lhs, rhs, '<', false); } @@ -421,6 +422,40 @@ namespace client static void leq (expr &lhs, expr &rhs) { compare_op(lhs, rhs, '>', true ); } static void geq (expr &lhs, expr &rhs) { compare_op(lhs, rhs, '<', true ); } + enum Function2ParamsType { + FUNCTION_MIN, + FUNCTION_MAX, + }; + // Store the result into param1. + static void function_2params(expr ¶m1, expr ¶m2, Function2ParamsType fun) + { + const char *err_msg = "Not a numeric type."; + param1.throw_if_not_numeric(err_msg); + param2.throw_if_not_numeric(err_msg); + if (param1.type == TYPE_DOUBLE || param2.type == TYPE_DOUBLE) { + double d = 0.; + switch (fun) { + case FUNCTION_MIN: d = std::min(param1.as_d(), param2.as_d()); break; + case FUNCTION_MAX: d = std::max(param1.as_d(), param2.as_d()); break; + default: param1.throw_exception("Internal error: invalid function"); + } + param1.data.d = d; + param1.type = TYPE_DOUBLE; + } else { + int i = 0.; + switch (fun) { + case FUNCTION_MIN: i = std::min(param1.as_i(), param2.as_i()); break; + case FUNCTION_MAX: i = std::max(param1.as_i(), param2.as_i()); break; + default: param1.throw_exception("Internal error: invalid function"); + } + param1.data.i = i; + param1.type = TYPE_INT; + } + } + // Store the result into param1. + static void min(expr ¶m1, expr ¶m2) { function_2params(param1, param2, FUNCTION_MIN); } + static void max(expr ¶m1, expr ¶m2) { function_2params(param1, param2, FUNCTION_MAX); } + static void regex_op(expr &lhs, boost::iterator_range &rhs, char op) { const std::string *subject = nullptr; @@ -1019,6 +1054,10 @@ namespace client | (lit('-') > unary_expression(_r1) ) [ px::bind(&FactorActions::minus_, _1, _val) ] | (lit('+') > unary_expression(_r1) > iter_pos) [ px::bind(&FactorActions::expr_, _1, _2, _val) ] | ((kw["not"] | '!') > unary_expression(_r1) > iter_pos) [ px::bind(&FactorActions::not_, _1, _val) ] + | (kw["min"] > '(' > conditional_expression(_r1) [_val = _1] > ',' > conditional_expression(_r1) > ')') + [ px::bind(&expr::min, _val, _2) ] + | (kw["max"] > '(' > conditional_expression(_r1) [_val = _1] > ',' > conditional_expression(_r1) > ')') + [ px::bind(&expr::max, _val, _2) ] | (strict_double > iter_pos) [ px::bind(&FactorActions::double_, _1, _2, _val) ] | (int_ > iter_pos) [ px::bind(&FactorActions::int_, _1, _2, _val) ] | (kw[bool_] > iter_pos) [ px::bind(&FactorActions::bool_, _1, _2, _val) ] @@ -1051,6 +1090,8 @@ namespace client ("elsif") ("endif") ("false") + ("min") + ("max") ("not") ("or") ("true"); From 4b87f71bbc46e2b974850fab2846c2dfadd70fd2 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 15 May 2018 14:20:32 +0200 Subject: [PATCH 03/63] Fix of the previous commmit. gcc and clang rightfully complained about a typo. --- xs/src/libslic3r/GCode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xs/src/libslic3r/GCode.cpp b/xs/src/libslic3r/GCode.cpp index 5e5b74efc..b581b3e76 100644 --- a/xs/src/libslic3r/GCode.cpp +++ b/xs/src/libslic3r/GCode.cpp @@ -798,7 +798,7 @@ void GCode::_do_export(Print &print, FILE *file, GCodePreviewData *preview_data) _writeln(file, this->placeholder_parser_process("end_filament_gcode", print.config.end_filament_gcode.get_at(m_writer.extruder()->id()), m_writer.extruder()->id(), &config)); } else { for (const std::string &end_gcode : print.config.end_filament_gcode.values) - _writeln(file, this->placeholder_parser_process("end_filament_gcode", end_gcode, (unsigned int)(&end_gcode - &print.config.end_filament_gcode.values.front(), &config))); + _writeln(file, this->placeholder_parser_process("end_filament_gcode", end_gcode, (unsigned int)(&end_gcode - &print.config.end_filament_gcode.values.front()), &config)); } _writeln(file, this->placeholder_parser_process("end_gcode", print.config.end_gcode, m_writer.extruder()->id(), &config)); } From 5c44453ced6a1b80061220bbc79d754a4f4a6b8e Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 16 May 2018 10:11:00 +0200 Subject: [PATCH 04/63] Fixed loading of configuration files after reverting to a snapshot storing the old configuration format. --- xs/src/slic3r/GUI/PresetBundle.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xs/src/slic3r/GUI/PresetBundle.cpp b/xs/src/slic3r/GUI/PresetBundle.cpp index 63b6a4e0c..84fa3a92f 100644 --- a/xs/src/slic3r/GUI/PresetBundle.cpp +++ b/xs/src/slic3r/GUI/PresetBundle.cpp @@ -210,6 +210,10 @@ std::string PresetBundle::load_system_presets() errors_cummulative += "\n"; } } + if (first) { + // No config bundle loaded, reset. + this->reset(false); + } return errors_cummulative; } From a97226ae54fc28c6bff790a51f45842868105478 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Tue, 15 May 2018 12:14:26 +0200 Subject: [PATCH 05/63] PresetUpdater: Fix: Don't offer updates on legacy datadir --- xs/src/slic3r/Utils/PresetUpdater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xs/src/slic3r/Utils/PresetUpdater.cpp b/xs/src/slic3r/Utils/PresetUpdater.cpp index 3b74b0c6b..fcbe20fb7 100644 --- a/xs/src/slic3r/Utils/PresetUpdater.cpp +++ b/xs/src/slic3r/Utils/PresetUpdater.cpp @@ -136,7 +136,7 @@ void PresetUpdater::priv::set_download_prefs(AppConfig *app_config) { enabled_version_check = app_config->get("version_check") == "1"; version_check_url = app_config->version_check_url(); - enabled_config_update = app_config->get("preset_update") == "1"; + enabled_config_update = app_config->get("preset_update") == "1" && !app_config->legacy_datadir(); } // Downloads a file (http get operation). Cancels if the Updater is being destroyed. From 0b4a61a8bad7d507a6ad93314346a879682a2b5c Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 16 May 2018 12:16:30 +0200 Subject: [PATCH 06/63] Fix of https://github.com/prusa3d/Slic3r/issues/791 The preset names have to be set at the PlaceholderParser before querying Print for a recommended file name. --- lib/Slic3r/GUI/Plater.pm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index eb655ae55..9d546db9d 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -1375,6 +1375,8 @@ sub export_gcode { }; Slic3r::GUI::catch_error($self) and return; + # Copy the names of active presets into the placeholder parser. + wxTheApp->{preset_bundle}->export_selections_pp($self->{print}->placeholder_parser); # select output file if ($output_file) { $self->{export_gcode_output_file} = eval { $self->{print}->output_filepath($output_file) }; @@ -1666,6 +1668,8 @@ sub _get_export_file { $suffix = '.3mf'; $wildcard = 'threemf'; } + # Copy the names of active presets into the placeholder parser. + wxTheApp->{preset_bundle}->export_selections_pp($self->{print}->placeholder_parser); my $output_file = eval { $self->{print}->output_filepath($main::opt{output} // '') }; Slic3r::GUI::catch_error($self) and return undef; $output_file =~ s/\.[gG][cC][oO][dD][eE]$/$suffix/; From b8fe48c56339333f67b33c2d9cfa612997a96d09 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 16 May 2018 13:56:03 +0200 Subject: [PATCH 07/63] Modification of the AboutDialog to be correct showing on dark theme of Linux --- xs/src/slic3r/GUI/AboutDialog.cpp | 50 ++++++++++++++++++------------- xs/src/slic3r/GUI/Field.cpp | 2 +- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/xs/src/slic3r/GUI/AboutDialog.cpp b/xs/src/slic3r/GUI/AboutDialog.cpp index e3c452872..0fed8d175 100644 --- a/xs/src/slic3r/GUI/AboutDialog.cpp +++ b/xs/src/slic3r/GUI/AboutDialog.cpp @@ -29,20 +29,27 @@ void AboutDialogLogo::onRepaint(wxEvent &event) } AboutDialog::AboutDialog() - : wxDialog(NULL, wxID_ANY, _(L("About Slic3r")), wxDefaultPosition, wxSize(600, 340), wxCAPTION) + : wxDialog(NULL, wxID_ANY, _(L("About Slic3r")), wxDefaultPosition, wxDefaultSize, wxCAPTION) { - SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)/**wxWHITE*/); + wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); + SetBackgroundColour(bgr_clr); wxBoxSizer* hsizer = new wxBoxSizer(wxHORIZONTAL); - this->SetSizer(hsizer); + + auto main_sizer = new wxBoxSizer(wxVERTICAL); + main_sizer->Add(hsizer, 0, wxEXPAND | wxALL, 20); // logo -// AboutDialogLogo* logo = new AboutDialogLogo(this); wxBitmap logo_bmp = wxBitmap(from_u8(Slic3r::var("Slic3r_192px.png")), wxBITMAP_TYPE_PNG); auto *logo = new wxStaticBitmap(this, wxID_ANY, std::move(logo_bmp)); - hsizer->Add(logo, 0, wxEXPAND | wxLEFT | wxRIGHT, 30); + hsizer->Add(logo, 1, wxALIGN_CENTRE_VERTICAL | wxEXPAND | wxTOP | wxBOTTOM, 35); wxBoxSizer* vsizer = new wxBoxSizer(wxVERTICAL); - hsizer->Add(vsizer, 1, wxEXPAND, 0); +#ifdef __WXMSW__ + int proportion = 2; +#else + int proportion = 3; +#endif + hsizer->Add(vsizer, proportion, wxEXPAND|wxLEFT, 20); // title { @@ -52,7 +59,7 @@ AboutDialog::AboutDialog() title_font.SetFamily(wxFONTFAMILY_ROMAN); title_font.SetPointSize(24); title->SetFont(title_font); - vsizer->Add(title, 0, wxALIGN_LEFT | wxTOP, 30); + vsizer->Add(title, 0, wxALIGN_LEFT | wxTOP, 10); } // version @@ -70,34 +77,34 @@ AboutDialog::AboutDialog() } // text - wxHtmlWindow* html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_NEVER); + wxHtmlWindow* html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO/*NEVER*/); { wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); - #ifdef __WXMSW__ - int size[] = {8,8,8,8,8,8,8}; - #else - int size[] = {11,11,11,11,11,11,11}; - #endif + const auto text_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); + auto text_clr_str = wxString::Format(wxT("#%02X%02X%02X"), text_clr.Red(), text_clr.Green(), text_clr.Blue()); + auto bgr_clr_str = wxString::Format(wxT("#%02X%02X%02X"), bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue()); + + const int fs = font.GetPointSize()-1; + int size[] = {fs,fs,fs,fs,fs,fs,fs}; html->SetFonts(font.GetFaceName(), font.GetFaceName(), size); - html->SetHTMLBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); html->SetBorders(2); - const char* text = + const auto text = wxString::Format( "" - "" - "" + "" + "" "Copyright © 2016-2018 Prusa Research.
" "Copyright © 2011-2017 Alessandro Ranellucci.
" "Slic3r is licensed under the " "GNU Affero General Public License, version 3." - "


" + "

" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others. " "Manual by Gary Hodgson. Inspired by the RepRap community.
" "Slic3r logo designed by Corey Daniels, Silk Icon Set designed by Mark James. " "
" "" - ""; + "", bgr_clr_str, text_clr_str, text_clr_str); html->SetPage(text); - vsizer->Add(html, 1, wxEXPAND | wxALIGN_LEFT | wxRIGHT | wxBOTTOM, 20); + vsizer->Add(html, 1, wxEXPAND | wxBOTTOM, 10); html->Bind(wxEVT_HTML_LINK_CLICKED, &AboutDialog::onLinkClicked, this); } @@ -108,6 +115,9 @@ AboutDialog::AboutDialog() this->Bind(wxEVT_LEFT_DOWN, &AboutDialog::onCloseDialog, this); logo->Bind(wxEVT_LEFT_DOWN, &AboutDialog::onCloseDialog, this); + + SetSizer(main_sizer); + main_sizer->SetSizeHints(this); } void AboutDialog::onLinkClicked(wxHtmlLinkEvent &event) diff --git a/xs/src/slic3r/GUI/Field.cpp b/xs/src/slic3r/GUI/Field.cpp index 4febae362..64f3426c4 100644 --- a/xs/src/slic3r/GUI/Field.cpp +++ b/xs/src/slic3r/GUI/Field.cpp @@ -106,7 +106,7 @@ namespace Slic3r { namespace GUI { } double val; str.ToCDouble(&val); - if (m_opt.min > val && val > m_opt.max) + if (m_opt.min > val || val > m_opt.max) { show_error(m_parent, _(L("Input value is out of range"))); if (m_opt.min > val) val = m_opt.min; From 687c91d6e965065af4e39589c7713df23a9cd078 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 16 May 2018 16:34:07 +0200 Subject: [PATCH 08/63] Parsing of obsolete presets from Config Bundle to remove them from user's profile when upgrading to a new configuration structure. --- resources/profiles/PrusaResearch.ini | 5 +++++ xs/src/slic3r/GUI/PresetBundle.cpp | 24 +++++++++++++++++++++++- xs/src/slic3r/GUI/PresetBundle.hpp | 7 +++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index ba8e55ad4..a28405921 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -1030,3 +1030,8 @@ max_print_height = 210 start_gcode = M115 U3.1.1-RC5 ; tell printer latest fw version\nM201 X1000 Y1000 Z200 E5000 ; sets maximum accelerations, mm/sec^2\nM203 X200 Y200 Z12 E120 ; sets maximum feedrates, mm/sec\nM204 S1250 T1250 ; sets acceleration (S) and retract acceleration (T)\nM205 X10 Y10 Z0.4 E2.5 ; sets the jerk limits, mm/sec\nM205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height==0.05}100{else}95{endif} printer_model = MK3 default_print_profile = 0.15mm OPTIMAL 0.6 nozzle MK3 + +# The obsolete presets will be removed when upgrading from the legacy configuration structure (up to Slic3r 1.39.2) to 1.40.0 and newer. +[obsolete_presets] +print="0.05mm DETAIL 0.25 nozzle";"0.05mm DETAIL MK3";"0.05mm DETAIL";"0.20mm NORMAL MK3";"0.35mm FAST MK3" +filament="ColorFabb Brass Bronze 1.75mm";"ColorFabb HT 1.75mm";"ColorFabb nGen 1.75mm";"ColorFabb Woodfil 1.75mm";"ColorFabb XT 1.75mm";"ColorFabb XT-CF20 1.75mm";"E3D PC-ABS 1.75mm";"Fillamentum ABS 1.75mm";"Fillamentum ASA 1.75mm";"Generic ABS 1.75mm";"Generic PET 1.75mm";"Generic PLA 1.75mm";"Prusa ABS 1.75mm";"Prusa HIPS 1.75mm";"Prusa PET 1.75mm";"Prusa PLA 1.75mm";"Taulman Bridge 1.75mm";"Taulman T-Glase 1.75mm" diff --git a/xs/src/slic3r/GUI/PresetBundle.cpp b/xs/src/slic3r/GUI/PresetBundle.cpp index 84fa3a92f..ef48eb6d4 100644 --- a/xs/src/slic3r/GUI/PresetBundle.cpp +++ b/xs/src/slic3r/GUI/PresetBundle.cpp @@ -104,6 +104,9 @@ void PresetBundle::reset(bool delete_files) this->printers .reset(delete_files); this->filament_presets.clear(); this->filament_presets.emplace_back(this->filaments.get_selected_preset().name); + this->obsolete_presets.prints.clear(); + this->obsolete_presets.filaments.clear(); + this->obsolete_presets.printers.clear(); } void PresetBundle::setup_directories() @@ -224,7 +227,10 @@ std::vector PresetBundle::merge_presets(PresetBundle &&other) std::vector duplicate_prints = this->prints .merge_presets(std::move(other.prints), this->vendors); std::vector duplicate_filaments = this->filaments.merge_presets(std::move(other.filaments), this->vendors); std::vector duplicate_printers = this->printers .merge_presets(std::move(other.printers), this->vendors); - append(duplicate_prints, std::move(duplicate_filaments)); + append(this->obsolete_presets.prints, std::move(other.obsolete_presets.prints)); + append(this->obsolete_presets.filaments, std::move(other.obsolete_presets.filaments)); + append(this->obsolete_presets.printers, std::move(other.obsolete_presets.printers)); + append(duplicate_prints, std::move(duplicate_filaments)); append(duplicate_prints, std::move(duplicate_printers)); return duplicate_prints; } @@ -365,6 +371,7 @@ DynamicPrintConfig PresetBundle::full_config() const } else { // Retrieve filament presets and build a single config object for them. // First collect the filament configurations based on the user selection of this->filament_presets. + // Here this->filaments.find_preset() and this->filaments.first_visible() return the edited copy of the preset if active. std::vector filament_configs; for (const std::string &filament_preset_name : this->filament_presets) filament_configs.emplace_back(&this->filaments.find_preset(filament_preset_name, true)->config); @@ -760,6 +767,7 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla flatten_configbundle_hierarchy(tree); // 2) Parse the property_tree, extract the active preset names and the profiles, save them into local config files. + // Parse the obsolete preset names, to be deleted when upgrading from the old configuration structure. std::vector loaded_prints; std::vector loaded_filaments; std::vector loaded_printers; @@ -799,6 +807,20 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla active_printer = kvp.second.data(); } } + } else if (section.first == "obsolete_presets") { + // Parse the names of obsolete presets. These presets will be deleted from user's + // profile directory on installation of this vendor preset. + for (auto &kvp : section.second) { + std::vector *dst = nullptr; + if (kvp.first == "print") + dst = &this->obsolete_presets.prints; + else if (kvp.first == "filament") + dst = &this->obsolete_presets.filaments; + else if (kvp.first == "printer") + dst = &this->obsolete_presets.printers; + if (dst) + unescape_strings_cstyle(kvp.second.data(), *dst); + } } else if (section.first == "settings") { // Load the settings. for (auto &kvp : section.second) { diff --git a/xs/src/slic3r/GUI/PresetBundle.hpp b/xs/src/slic3r/GUI/PresetBundle.hpp index 9f2afbead..a5c5682f9 100644 --- a/xs/src/slic3r/GUI/PresetBundle.hpp +++ b/xs/src/slic3r/GUI/PresetBundle.hpp @@ -54,6 +54,13 @@ public: // and the system profiles will point to the VendorProfile instances owned by PresetBundle::vendors. std::set vendors; + struct ObsoletePresets { + std::vector prints; + std::vector filaments; + std::vector printers; + }; + ObsoletePresets obsolete_presets; + bool has_defauls_only() const { return prints.size() <= 1 && filaments.size() <= 1 && printers.size() <= 1; } From cc52654db3d7b214a31eef05d43545f5eabede9b Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 17 May 2018 08:50:05 +0200 Subject: [PATCH 09/63] Set minimum width for the right sizer --- lib/Slic3r/GUI/Plater.pm | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 9d546db9d..00579ba87 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -495,6 +495,7 @@ sub new { $scrolled_window_sizer->Add($print_info_sizer, 0, wxEXPAND, 0); my $right_sizer = Wx::BoxSizer->new(wxVERTICAL); + $right_sizer->SetMinSize([320,-1]); $right_sizer->Add($presets, 0, wxEXPAND | wxTOP, 10) if defined $presets; $right_sizer->Add($frequently_changed_parameters_sizer, 0, wxEXPAND | wxTOP, 0) if defined $frequently_changed_parameters_sizer; $right_sizer->Add($buttons_sizer, 0, wxEXPAND | wxBOTTOM, 5); From 77578f4a3e36d1efd184c458429101a65d7cba53 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 17 May 2018 09:26:50 +0200 Subject: [PATCH 10/63] Reset tooltips for manifold objects into object info panel --- lib/Slic3r/GUI/Plater.pm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 9d546db9d..0b3aea1e6 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -2012,6 +2012,8 @@ sub selection_changed { } else { $self->{object_info_manifold}->SetLabel(L("Yes")); $self->{object_info_manifold_warning_icon}->Hide; + $self->{object_info_manifold}->SetToolTipString(""); + $self->{object_info_manifold_warning_icon}->SetToolTipString(""); } } else { $self->{object_info_facets}->SetLabel($object->facets); @@ -2020,6 +2022,7 @@ sub selection_changed { $self->{"object_info_$_"}->SetLabel("") for qw(size volume facets materials manifold); $self->{object_info_manifold_warning_icon}->Hide; $self->{object_info_manifold}->SetToolTipString(""); + $self->{object_info_manifold_warning_icon}->SetToolTipString(""); } $self->Layout; } From e13564cb190458a818f6ad40dc8705c9c6ae8a5e Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 17 May 2018 09:50:40 +0200 Subject: [PATCH 11/63] Fixed shell visualization in g-code preview --- xs/src/slic3r/GUI/3DScene.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index df8b1fbfc..6569f480f 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -1762,12 +1762,13 @@ void _3DScene::load_gcode_preview(const Print* print, const GCodePreviewData* pr else { _generate_legend_texture(*preview_data, tool_colors); - _load_shells(*print, *volumes, use_VBOs); // removes empty volumes volumes->volumes.erase(std::remove_if(volumes->volumes.begin(), volumes->volumes.end(), [](const GLVolume *volume) { return volume->print_zs.empty(); }), volumes->volumes.end()); + + _load_shells(*print, *volumes, use_VBOs); } } From 6f792b7ffbc90ef535ba7ced09cf77a8110e87c0 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 17 May 2018 10:23:02 +0200 Subject: [PATCH 12/63] Horrible workaround to make the gcode preview dropdown (show feature types) work on all platforms --- xs/src/slic3r/GUI/wxExtensions.cpp | 31 +++++++++++++++++++++++------- xs/src/slic3r/GUI/wxExtensions.hpp | 15 +++++++++++++++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/xs/src/slic3r/GUI/wxExtensions.cpp b/xs/src/slic3r/GUI/wxExtensions.cpp index 8bc282474..5949efb37 100644 --- a/xs/src/slic3r/GUI/wxExtensions.cpp +++ b/xs/src/slic3r/GUI/wxExtensions.cpp @@ -82,15 +82,27 @@ void wxCheckListBoxComboPopup::OnCheckListBox(wxCommandEvent& evt) { // forwards the checklistbox event to the owner wxComboCtrl - wxComboCtrl* cmb = GetComboCtrl(); - if (cmb != nullptr) + if (m_check_box_events_status == OnCheckListBoxFunction::FreeToProceed ) { - wxCommandEvent event(wxEVT_CHECKLISTBOX, cmb->GetId()); - event.SetEventObject(cmb); - cmb->ProcessWindowEvent(event); + wxComboCtrl* cmb = GetComboCtrl(); + if (cmb != nullptr) { + wxCommandEvent event(wxEVT_CHECKLISTBOX, cmb->GetId()); + event.SetEventObject(cmb); + cmb->ProcessWindowEvent(event); + } } evt.Skip(); + + #ifndef _WIN32 // events are sent differently on OSX+Linux vs Win (more description in header file) + if ( m_check_box_events_status == OnCheckListBoxFunction::RefuseToProceed ) + // this happens if the event was resent by OnListBoxSelection - next call to OnListBoxSelection is due to user clicking the text, so the function should + // explicitly change the state on the checkbox + m_check_box_events_status = OnCheckListBoxFunction::WasRefusedLastTime; + else + // if the user clicked the checkbox square, this event was sent before OnListBoxSelection was called, so we don't want it to resend it + m_check_box_events_status = OnCheckListBoxFunction::RefuseToProceed; + #endif } void wxCheckListBoxComboPopup::OnListBoxSelection(wxCommandEvent& evt) @@ -100,9 +112,14 @@ void wxCheckListBoxComboPopup::OnListBoxSelection(wxCommandEvent& evt) int selId = GetSelection(); if (selId != wxNOT_FOUND) { - Check((unsigned int)selId, !IsChecked((unsigned int)selId)); - SetSelection(wxNOT_FOUND); + #ifndef _WIN32 + if (m_check_box_events_status == OnCheckListBoxFunction::RefuseToProceed) + #endif + Check((unsigned int)selId, !IsChecked((unsigned int)selId)); + m_check_box_events_status = OnCheckListBoxFunction::FreeToProceed; // so the checkbox reacts to square-click the next time + + SetSelection(wxNOT_FOUND); wxCommandEvent event(wxEVT_CHECKLISTBOX, GetId()); event.SetInt(selId); event.SetEventObject(this); diff --git a/xs/src/slic3r/GUI/wxExtensions.hpp b/xs/src/slic3r/GUI/wxExtensions.hpp index ed8bb9276..3667c7905 100644 --- a/xs/src/slic3r/GUI/wxExtensions.hpp +++ b/xs/src/slic3r/GUI/wxExtensions.hpp @@ -13,6 +13,21 @@ class wxCheckListBoxComboPopup : public wxCheckListBox, public wxComboPopup wxString m_text; + // Events sent on mouseclick are quite complex. Function OnListBoxSelection is supposed to pass the event to the checkbox, which works fine on + // Win. On OSX and Linux the events are generated differently - clicking on the checkbox square generates the event twice (and the square + // therefore seems not to respond). + // This enum is meant to save current state of affairs, i.e., if the event forwarding is ok to do or not. It is only used on Linux + // and OSX by some #ifdefs. It also stores information whether OnListBoxSelection is supposed to change the checkbox status, + // or if it changed status on its own already (which happens when the square is clicked). More comments in OnCheckListBox(...) + // There indeed is a better solution, maybe making a custom event used for the event passing to distinguish the original and passed message + // and blocking one of them on OSX and Linux. Feel free to refactor, but carefully test on all platforms. + enum class OnCheckListBoxFunction{ + FreeToProceed, + RefuseToProceed, + WasRefusedLastTime + } m_check_box_events_status = OnCheckListBoxFunction::FreeToProceed; + + public: virtual bool Create(wxWindow* parent); virtual wxWindow* GetControl(); From e3d84407e0412c2fcc9e81dbb540b2872a37300b Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 17 May 2018 10:30:20 +0200 Subject: [PATCH 13/63] Fix of https://github.com/prusa3d/Slic3r/issues/896 Fixed a bug in parsering a Point from a config file. --- xs/src/libslic3r/Config.hpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/xs/src/libslic3r/Config.hpp b/xs/src/libslic3r/Config.hpp index 14050c6cc..bde1eb651 100644 --- a/xs/src/libslic3r/Config.hpp +++ b/xs/src/libslic3r/Config.hpp @@ -644,12 +644,9 @@ public: bool deserialize(const std::string &str, bool append = false) override { UNUSED(append); - std::istringstream iss(str); - iss >> this->value.x; - iss.ignore(std::numeric_limits::max(), ','); - iss.ignore(std::numeric_limits::max(), 'x'); - iss >> this->value.y; - return true; + char dummy; + return sscanf(str.data(), " %lf , %lf %c", &this->value.x, &this->value.y, &dummy) == 2 || + sscanf(str.data(), " %lf x %lf %c", &this->value.x, &this->value.y, &dummy) == 2; } }; From 2cb108fbf841a3fe5be317e8cbf3d863ff8ec6a2 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 17 May 2018 12:56:14 +0200 Subject: [PATCH 14/63] Fix in File menu --- lib/Slic3r/GUI/MainFrame.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Slic3r/GUI/MainFrame.pm b/lib/Slic3r/GUI/MainFrame.pm index fbcd34a3f..a8de4a135 100644 --- a/lib/Slic3r/GUI/MainFrame.pm +++ b/lib/Slic3r/GUI/MainFrame.pm @@ -191,7 +191,7 @@ sub _init_menubar { # File menu my $fileMenu = Wx::Menu->new; { - wxTheApp->append_menu_item($fileMenu, L("Open STL/OBJ/AMF…\tCtrl+O"), L('Open a model'), sub { + wxTheApp->append_menu_item($fileMenu, L("Open STL/OBJ/AMF/3MF…\tCtrl+O"), L('Open a model'), sub { $self->{plater}->add if $self->{plater}; }, undef, undef); #'brick_add.png'); $self->_append_menu_item($fileMenu, L("&Load Config…\tCtrl+L"), L('Load exported configuration file'), sub { From 96c7c4a58b819b8cc0ca0dd1c9e00717a9b04e42 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Wed, 16 May 2018 19:41:35 +0200 Subject: [PATCH 15/63] PresetUpdater: Remove obsolete presets --- xs/src/slic3r/Utils/PresetUpdater.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/xs/src/slic3r/Utils/PresetUpdater.cpp b/xs/src/slic3r/Utils/PresetUpdater.cpp index fcbe20fb7..a5208e3c2 100644 --- a/xs/src/slic3r/Utils/PresetUpdater.cpp +++ b/xs/src/slic3r/Utils/PresetUpdater.cpp @@ -409,6 +409,17 @@ void PresetUpdater::priv::perform_updates(Updates &&updates, bool snapshot) cons for (const auto &preset : bundle.prints) { preset_remover(preset); } for (const auto &preset : bundle.filaments) { preset_remover(preset); } for (const auto &preset : bundle.printers) { preset_remover(preset); } + + // Also apply the `obsolete_presets` property, removing obsolete ini files + auto obsolete_remover = [](const char *subdir, const std::string &preset) { + auto path = fs::path(Slic3r::data_dir()) / subdir / preset; + path += ".ini"; + fs::remove(path); + }; + + for (const auto &name : bundle.obsolete_presets.prints) { obsolete_remover("print", name); } + for (const auto &name : bundle.obsolete_presets.filaments) { obsolete_remover("filament", name); } + for (const auto &name : bundle.obsolete_presets.printers) { obsolete_remover("printer", name); } } } } From 35bf4aee7df3baee5f64b769d58d20199bb5268a Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 17 May 2018 14:08:50 +0200 Subject: [PATCH 16/63] Fixed loading of configuraton values octoprint_host, support_material_threshold They were incorrectly handled by the handle_legacy() function, which has been ported from the upstream Slic3r without inspecting its content. --- xs/src/libslic3r/PrintConfig.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/xs/src/libslic3r/PrintConfig.cpp b/xs/src/libslic3r/PrintConfig.cpp index 697a6f0d4..dcfc3ffe7 100644 --- a/xs/src/libslic3r/PrintConfig.cpp +++ b/xs/src/libslic3r/PrintConfig.cpp @@ -1911,8 +1911,10 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va std::ostringstream oss; oss << "0x0," << p.value.x << "x0," << p.value.x << "x" << p.value.y << ",0x" << p.value.y; value = oss.str(); - } else if (opt_key == "octoprint_host" && !value.empty()) { - opt_key = "print_host"; +// Maybe one day we will rename octoprint_host to print_host as it has been done in the upstream Slic3r. +// Commenting this out fixes github issue #869 for now. +// } else if (opt_key == "octoprint_host" && !value.empty()) { +// opt_key = "print_host"; } else if ((opt_key == "perimeter_acceleration" && value == "25") || (opt_key == "infill_acceleration" && value == "50")) { /* For historical reasons, the world's full of configs having these very low values; @@ -1923,10 +1925,6 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va } else if (opt_key == "support_material_pattern" && value == "pillars") { // Slic3r PE does not support the pillars. They never worked well. value = "rectilinear"; - } else if (opt_key == "support_material_threshold" && value == "0") { - // 0 used to be automatic threshold, but we introduced percent values so let's - // transform it into the default value - value = "60%"; } // Ignore the following obsolete configuration keys: From 9b4afb77d159dab56b0496319344f8623a2da175 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 17 May 2018 15:18:52 +0200 Subject: [PATCH 17/63] Hide legend texture when invalidating gcode by editing config data --- lib/Slic3r/GUI/Plater/3DPreview.pm | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Slic3r/GUI/Plater/3DPreview.pm b/lib/Slic3r/GUI/Plater/3DPreview.pm index b746de98f..6b448080d 100644 --- a/lib/Slic3r/GUI/Plater/3DPreview.pm +++ b/lib/Slic3r/GUI/Plater/3DPreview.pm @@ -380,6 +380,7 @@ sub load_print { #$self->canvas->volumes->[$_]->color->[3] = 0.2 for @volume_ids; } $self->show_hide_ui_elements('simple'); + $self->canvas->reset_legend_texture(); } else { $self->{force_sliders_full_range} = (scalar(@{$self->canvas->volumes}) == 0); $self->canvas->load_gcode_preview($self->print, $self->gcode_preview_data, \@colors); From e783e005787f5ed91da1a15e9a30e81923af965e Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Thu, 17 May 2018 16:19:40 +0200 Subject: [PATCH 18/63] AppConfig: Remember previous Slic3r version --- xs/src/slic3r/GUI/AppConfig.cpp | 1 + xs/src/slic3r/GUI/AppConfig.hpp | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/xs/src/slic3r/GUI/AppConfig.cpp b/xs/src/slic3r/GUI/AppConfig.cpp index 70f4ba110..c1c90fb72 100644 --- a/xs/src/slic3r/GUI/AppConfig.cpp +++ b/xs/src/slic3r/GUI/AppConfig.cpp @@ -100,6 +100,7 @@ void AppConfig::load() auto ini_ver = Semver::parse(get("version")); m_legacy_datadir = false; if (ini_ver) { + m_orig_version = *ini_ver; // Make 1.40.0 alphas compare well ini_ver->set_metadata(boost::none); ini_ver->set_prerelease(boost::none); diff --git a/xs/src/slic3r/GUI/AppConfig.hpp b/xs/src/slic3r/GUI/AppConfig.hpp index 16469f0e9..a9d8f9307 100644 --- a/xs/src/slic3r/GUI/AppConfig.hpp +++ b/xs/src/slic3r/GUI/AppConfig.hpp @@ -13,7 +13,13 @@ namespace Slic3r { class AppConfig { public: - AppConfig() : m_dirty(false), m_legacy_datadir(false) { this->reset(); } + AppConfig() : + m_dirty(false), + m_orig_version(Semver::invalid()), + m_legacy_datadir(false) + { + this->reset(); + } // Clear and reset to defaults. void reset(); @@ -100,6 +106,10 @@ public: // This returns a hardcoded string unless it is overriden by "version_check_url" in the ini file. std::string version_check_url() const; + // Returns the original Slic3r version found in the ini file before it was overwritten + // by the current version + Semver orig_version() const { return m_orig_version; } + // Does the config file exist? static bool exists(); @@ -110,6 +120,8 @@ private: VendorMap m_vendors; // Has any value been modified since the config.ini has been last saved or loaded? bool m_dirty; + // Original version found in the ini file before it was overwritten + Semver m_orig_version; // Whether the existing version is before system profiles & configuration updating bool m_legacy_datadir; }; From 5fd216461266dd14ce611643f66b6771edfe0bca Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Thu, 17 May 2018 17:19:33 +0200 Subject: [PATCH 19/63] ConfigWizard: Fix incorrent wizard run after a language change --- xs/src/slic3r/GUI/AppConfig.hpp | 1 + xs/src/slic3r/GUI/ConfigWizard.cpp | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/xs/src/slic3r/GUI/AppConfig.hpp b/xs/src/slic3r/GUI/AppConfig.hpp index a9d8f9307..08741e1e4 100644 --- a/xs/src/slic3r/GUI/AppConfig.hpp +++ b/xs/src/slic3r/GUI/AppConfig.hpp @@ -101,6 +101,7 @@ public: // Returns true if the user's data directory comes from before Slic3r 1.40.0 (no updating) bool legacy_datadir() const { return m_legacy_datadir; } + bool set_legacy_datadir(bool value) { m_legacy_datadir = value; } // Get the Slic3r version check url. // This returns a hardcoded string unless it is overriden by "version_check_url" in the ini file. diff --git a/xs/src/slic3r/GUI/ConfigWizard.cpp b/xs/src/slic3r/GUI/ConfigWizard.cpp index 1217f8683..6b8e8abaf 100644 --- a/xs/src/slic3r/GUI/ConfigWizard.cpp +++ b/xs/src/slic3r/GUI/ConfigWizard.cpp @@ -835,7 +835,9 @@ bool ConfigWizard::run(PresetBundle *preset_bundle, const PresetUpdater *updater { BOOST_LOG_TRIVIAL(info) << "Running ConfigWizard, reason: " << p->run_reason; if (ShowModal() == wxID_OK) { - p->apply_config(GUI::get_app_config(), preset_bundle, updater); + auto *app_config = GUI::get_app_config(); + p->apply_config(app_config, preset_bundle, updater); + app_config->set_legacy_datadir(false); BOOST_LOG_TRIVIAL(info) << "ConfigWizard applied"; return true; } else { From 19221b749cf820aa40b99548c1340c346b73e597 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 18 May 2018 08:21:24 +0200 Subject: [PATCH 20/63] Fix of https://github.com/prusa3d/Slic3r/issues/869 --- xs/src/libslic3r/PrintConfig.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/xs/src/libslic3r/PrintConfig.cpp b/xs/src/libslic3r/PrintConfig.cpp index dcfc3ffe7..9333132ff 100644 --- a/xs/src/libslic3r/PrintConfig.cpp +++ b/xs/src/libslic3r/PrintConfig.cpp @@ -1933,7 +1933,10 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va "support_material_tool", "acceleration", "adjust_overhang_flow", "standby_temperature", "scale", "rotate", "duplicate", "duplicate_grid", "start_perimeters_at_concave_points", "start_perimeters_at_non_overhang", "randomize_start", - "seal_position", "vibration_limit", "bed_size", "octoprint_host", + "seal_position", "vibration_limit", "bed_size", + // Maybe one day we will rename octoprint_host to print_host as it has been done in the upstream Slic3r. + // Commenting this out fixes github issue #869 for now. + // "octoprint_host", "print_center", "g0", "threads", "pressure_advance", "wipe_tower_per_color_wipe" }; From 651c4ab0ae9cf533d470c891a615364a0539c2de Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 18 May 2018 08:46:33 +0200 Subject: [PATCH 21/63] Fixed a typo in AppConfig --- xs/src/libslic3r/PerimeterGenerator.hpp | 5 ++--- xs/src/libslic3r/PrintObject.cpp | 1 - xs/src/slic3r/GUI/AppConfig.hpp | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/xs/src/libslic3r/PerimeterGenerator.hpp b/xs/src/libslic3r/PerimeterGenerator.hpp index 04557a2c0..c0f449908 100644 --- a/xs/src/libslic3r/PerimeterGenerator.hpp +++ b/xs/src/libslic3r/PerimeterGenerator.hpp @@ -24,9 +24,8 @@ public: // Children contour, may be both CCW and CW oriented (outer contours or holes). std::vector children; - PerimeterGeneratorLoop(Polygon polygon, unsigned short depth) - : polygon(polygon), is_contour(false), depth(depth) - {}; + PerimeterGeneratorLoop(Polygon polygon, unsigned short depth, bool is_contour) : + polygon(polygon), is_contour(is_contour), depth(depth) {} // External perimeter. It may be CCW or CW oriented (outer contour or hole contour). bool is_external() const { return this->depth == 0; } // An island, which may have holes, but it does not have another internal island. diff --git a/xs/src/libslic3r/PrintObject.cpp b/xs/src/libslic3r/PrintObject.cpp index c61fc102b..b0341db16 100644 --- a/xs/src/libslic3r/PrintObject.cpp +++ b/xs/src/libslic3r/PrintObject.cpp @@ -1459,7 +1459,6 @@ void PrintObject::_make_perimeters() size_t region_id = region_it - this->_print->regions.begin(); const PrintRegion ®ion = **region_it; - if (!region.config.extra_perimeters || region.config.perimeters == 0 || region.config.fill_density == 0 diff --git a/xs/src/slic3r/GUI/AppConfig.hpp b/xs/src/slic3r/GUI/AppConfig.hpp index 08741e1e4..b742176ed 100644 --- a/xs/src/slic3r/GUI/AppConfig.hpp +++ b/xs/src/slic3r/GUI/AppConfig.hpp @@ -101,7 +101,7 @@ public: // Returns true if the user's data directory comes from before Slic3r 1.40.0 (no updating) bool legacy_datadir() const { return m_legacy_datadir; } - bool set_legacy_datadir(bool value) { m_legacy_datadir = value; } + void set_legacy_datadir(bool value) { m_legacy_datadir = value; } // Get the Slic3r version check url. // This returns a hardcoded string unless it is overriden by "version_check_url" in the ini file. From 3f08ef70f1db16a1971822d41a047a1cc43bb7ce Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 18 May 2018 09:52:09 +0200 Subject: [PATCH 22/63] Fix of extraneous infill over thin walls. Fixes https://github.com/prusa3d/Slic3r/issues/670 and some of https://github.com/prusa3d/Slic3r/issues/895 PerimeterGenerator was using an unsafe clipper offset function, which performed offset for both a contour and its holes together. With this commit the offsets were replaced with their safe counterparts, though these safe counterparts may be somehow slower (performing offset on ExPolygon or ExPolygons, piece by piece). Also there was a bug, where if the infill & gap fill consumed everything of the polygon, a polygon one onion shell above was still used for infill. --- xs/src/libslic3r/ClipperUtils.cpp | 29 ++- xs/src/libslic3r/ClipperUtils.hpp | 3 + xs/src/libslic3r/ExPolygon.cpp | 30 +-- xs/src/libslic3r/PerimeterGenerator.cpp | 277 +++++++++--------------- 4 files changed, 138 insertions(+), 201 deletions(-) diff --git a/xs/src/libslic3r/ClipperUtils.cpp b/xs/src/libslic3r/ClipperUtils.cpp index 86123b23c..31a12aa77 100644 --- a/xs/src/libslic3r/ClipperUtils.cpp +++ b/xs/src/libslic3r/ClipperUtils.cpp @@ -458,6 +458,19 @@ offset2_ex(const Polygons &polygons, const float delta1, const float delta2, return ClipperPaths_to_Slic3rExPolygons(output); } +//FIXME Vojtech: This functon may likely be optimized to avoid some of the Slic3r to Clipper +// conversions and unnecessary Clipper calls. +ExPolygons offset2_ex(const ExPolygons &expolygons, const float delta1, + const float delta2, ClipperLib::JoinType joinType, double miterLimit) +{ + Polygons polys; + for (const ExPolygon &expoly : expolygons) + append(polys, + offset(offset_ex(expoly, delta1, joinType, miterLimit), + delta2, joinType, miterLimit)); + return union_ex(polys); +} + template T _clipper_do(const ClipperLib::ClipType clipType, const Polygons &subject, @@ -650,8 +663,7 @@ union_pt_chained(const Polygons &subject, bool safety_offset_) return retval; } -void -traverse_pt(ClipperLib::PolyNodes &nodes, Polygons* retval) +void traverse_pt(ClipperLib::PolyNodes &nodes, Polygons* retval) { /* use a nearest neighbor search to order these children TODO: supply start_near to chained_path() too? */ @@ -677,8 +689,7 @@ traverse_pt(ClipperLib::PolyNodes &nodes, Polygons* retval) } } -Polygons -simplify_polygons(const Polygons &subject, bool preserve_collinear) +Polygons simplify_polygons(const Polygons &subject, bool preserve_collinear) { // convert into Clipper polygons ClipperLib::Paths input_subject = Slic3rMultiPoints_to_ClipperPaths(subject); @@ -698,13 +709,11 @@ simplify_polygons(const Polygons &subject, bool preserve_collinear) return ClipperPaths_to_Slic3rPolygons(output); } -ExPolygons -simplify_polygons_ex(const Polygons &subject, bool preserve_collinear) +ExPolygons simplify_polygons_ex(const Polygons &subject, bool preserve_collinear) { - if (!preserve_collinear) { - return union_ex(simplify_polygons(subject, preserve_collinear)); - } - + if (! preserve_collinear) + return union_ex(simplify_polygons(subject, false)); + // convert into Clipper polygons ClipperLib::Paths input_subject = Slic3rMultiPoints_to_ClipperPaths(subject); diff --git a/xs/src/libslic3r/ClipperUtils.hpp b/xs/src/libslic3r/ClipperUtils.hpp index eb83c31a3..b065cfe07 100644 --- a/xs/src/libslic3r/ClipperUtils.hpp +++ b/xs/src/libslic3r/ClipperUtils.hpp @@ -80,6 +80,9 @@ Slic3r::Polygons offset2(const Slic3r::Polygons &polygons, const float delta1, Slic3r::ExPolygons offset2_ex(const Slic3r::Polygons &polygons, const float delta1, const float delta2, ClipperLib::JoinType joinType = ClipperLib::jtMiter, double miterLimit = 3); +Slic3r::ExPolygons offset2_ex(const Slic3r::ExPolygons &expolygons, const float delta1, + const float delta2, ClipperLib::JoinType joinType = ClipperLib::jtMiter, + double miterLimit = 3); Slic3r::Polygons _clipper(ClipperLib::ClipType clipType, const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, bool safety_offset_ = false); diff --git a/xs/src/libslic3r/ExPolygon.cpp b/xs/src/libslic3r/ExPolygon.cpp index 1d4bac50b..cd57fd7b0 100644 --- a/xs/src/libslic3r/ExPolygon.cpp +++ b/xs/src/libslic3r/ExPolygon.cpp @@ -168,52 +168,42 @@ ExPolygon::overlaps(const ExPolygon &other) const return ! other.contour.points.empty() && this->contains_b(other.contour.points.front()); } -void -ExPolygon::simplify_p(double tolerance, Polygons* polygons) const +void ExPolygon::simplify_p(double tolerance, Polygons* polygons) const { Polygons pp = this->simplify_p(tolerance); polygons->insert(polygons->end(), pp.begin(), pp.end()); } -Polygons -ExPolygon::simplify_p(double tolerance) const +Polygons ExPolygon::simplify_p(double tolerance) const { Polygons pp; pp.reserve(this->holes.size() + 1); - // contour { Polygon p = this->contour; p.points.push_back(p.points.front()); p.points = MultiPoint::_douglas_peucker(p.points, tolerance); p.points.pop_back(); - pp.push_back(p); + pp.emplace_back(std::move(p)); } - // holes - for (Polygons::const_iterator it = this->holes.begin(); it != this->holes.end(); ++it) { - Polygon p = *it; + for (Polygon p : this->holes) { p.points.push_back(p.points.front()); p.points = MultiPoint::_douglas_peucker(p.points, tolerance); p.points.pop_back(); - pp.push_back(p); + pp.emplace_back(std::move(p)); } - pp = simplify_polygons(pp); - return pp; + return simplify_polygons(pp); } -ExPolygons -ExPolygon::simplify(double tolerance) const +ExPolygons ExPolygon::simplify(double tolerance) const { - Polygons pp = this->simplify_p(tolerance); - return union_ex(pp); + return union_ex(this->simplify_p(tolerance)); } -void -ExPolygon::simplify(double tolerance, ExPolygons* expolygons) const +void ExPolygon::simplify(double tolerance, ExPolygons* expolygons) const { - ExPolygons ep = this->simplify(tolerance); - expolygons->insert(expolygons->end(), ep.begin(), ep.end()); + append(*expolygons, this->simplify(tolerance)); } void diff --git a/xs/src/libslic3r/PerimeterGenerator.cpp b/xs/src/libslic3r/PerimeterGenerator.cpp index ea9c73fa4..c2284aad4 100644 --- a/xs/src/libslic3r/PerimeterGenerator.cpp +++ b/xs/src/libslic3r/PerimeterGenerator.cpp @@ -6,8 +6,7 @@ namespace Slic3r { -void -PerimeterGenerator::process() +void PerimeterGenerator::process() { // other perimeters this->_mm3_per_mm = this->perimeter_flow.mm3_per_mm(); @@ -45,7 +44,6 @@ PerimeterGenerator::process() // lower layer, so we take lower slices and offset them by half the nozzle diameter used // in the current layer double nozzle_diameter = this->print_config->nozzle_diameter.get_at(this->config->perimeter_extruder-1); - this->_lower_slices_p = offset(*this->lower_slices, float(scale_(+nozzle_diameter/2))); } @@ -53,149 +51,115 @@ PerimeterGenerator::process() // extra perimeters for each one for (const Surface &surface : this->slices->surfaces) { // detect how many perimeters must be generated for this island - const int loop_number = this->config->perimeters + surface.extra_perimeters -1; // 0-indexed loops - - Polygons gaps; - - Polygons last = surface.expolygon.simplify_p(SCALED_RESOLUTION); - if (loop_number >= 0) { // no loops = -1 - + int loop_number = this->config->perimeters + surface.extra_perimeters - 1; // 0-indexed loops + ExPolygons last = union_ex(surface.expolygon.simplify_p(SCALED_RESOLUTION)); + ExPolygons gaps; + if (loop_number >= 0) { + // In case no perimeters are to be generated, loop_number will equal to -1. std::vector contours(loop_number+1); // depth => loops std::vector holes(loop_number+1); // depth => loops ThickPolylines thin_walls; - // we loop one time more than needed in order to find gaps after the last perimeter was applied - for (int i = 0; i <= loop_number+1; ++i) { // outer loop is 0 - Polygons offsets; + for (int i = 0;; ++ i) { // outer loop is 0 + // Calculate next onion shell of perimeters. + ExPolygons offsets; if (i == 0) { // the minimum thickness of a single loop is: // ext_width/2 + ext_spacing/2 + spacing/2 + width/2 - if (this->config->thin_walls) { - offsets = offset2( + offsets = this->config->thin_walls ? + offset2_ex( last, -(ext_perimeter_width / 2 + ext_min_spacing / 2 - 1), - +(ext_min_spacing/2 - 1) - ); - } else { - offsets = offset(last, - ext_perimeter_width / 2); - } - + +(ext_min_spacing / 2 - 1)) : + offset_ex(last, - ext_perimeter_width / 2); // look for thin walls if (this->config->thin_walls) { - Polygons diffpp = diff( - last, - offset(offsets, ext_perimeter_width / 2), - true // medial axis requires non-overlapping geometry - ); - // the following offset2 ensures almost nothing in @thin_walls is narrower than $min_width // (actually, something larger than that still may exist due to mitering or other causes) coord_t min_width = scale_(this->ext_perimeter_flow.nozzle_diameter / 3); - ExPolygons expp = offset2_ex(diffpp, -min_width/2, +min_width/2); - + ExPolygons expp = offset2_ex( + // medial axis requires non-overlapping geometry + diff_ex(to_polygons(last), + offset(offsets, ext_perimeter_width / 2), + true), + - min_width / 2, min_width / 2); // the maximum thickness of our thin wall area is equal to the minimum thickness of a single loop - for (ExPolygons::const_iterator ex = expp.begin(); ex != expp.end(); ++ex) - ex->medial_axis(ext_perimeter_width + ext_perimeter_spacing2, min_width, &thin_walls); - - #ifdef DEBUG - printf(" " PRINTF_ZU " thin walls detected\n", thin_walls.size()); - #endif - - /* - if (false) { - require "Slic3r/SVG.pm"; - Slic3r::SVG::output( - "medial_axis.svg", - no_arrows => 1, - #expolygons => \@expp, - polylines => \@thin_walls, - ); - } - */ + for (ExPolygon &ex : expp) + ex.medial_axis(ext_perimeter_width + ext_perimeter_spacing2, min_width, &thin_walls); } } else { //FIXME Is this offset correct if the line width of the inner perimeters differs // from the line width of the infill? coord_t distance = (i == 1) ? ext_perimeter_spacing2 : perimeter_spacing; - - if (this->config->thin_walls) { + offsets = this->config->thin_walls ? // This path will ensure, that the perimeters do not overfill, as in // prusa3d/Slic3r GH #32, but with the cost of rounding the perimeters // excessively, creating gaps, which then need to be filled in by the not very // reliable gap fill algorithm. // Also the offset2(perimeter, -x, x) may sometimes lead to a perimeter, which is larger than // the original. - offsets = offset2( - last, - -(distance + min_spacing/2 - 1), - +(min_spacing/2 - 1) - ); - } else { + offset2_ex(last, + - (distance + min_spacing / 2 - 1), + min_spacing / 2 - 1) : // If "detect thin walls" is not enabled, this paths will be entered, which // leads to overflows, as in prusa3d/Slic3r GH #32 - offsets = offset( - last, - -distance - ); - } - + offset_ex(last, - distance); // look for gaps - if (this->config->gap_fill_speed.value > 0 && this->config->fill_density.value > 0) { + if (this->config->gap_fill_speed.value > 0 && this->config->fill_density.value > 0) // not using safety offset here would "detect" very narrow gaps // (but still long enough to escape the area threshold) that gap fill // won't be able to fill but we'd still remove from infill area - Polygons diff_pp = diff( - offset(last, -0.5*distance), - offset(offsets, +0.5*distance + 10) // safety offset - ); - gaps.insert(gaps.end(), diff_pp.begin(), diff_pp.end()); - } - } - - if (offsets.empty()) break; - if (i > loop_number) break; // we were only looking for gaps this time - - last = offsets; - for (Polygons::const_iterator polygon = offsets.begin(); polygon != offsets.end(); ++polygon) { - PerimeterGeneratorLoop loop(*polygon, i); - loop.is_contour = polygon->is_counter_clockwise(); - if (loop.is_contour) { - contours[i].push_back(loop); - } else { - holes[i].push_back(loop); + append(gaps, diff_ex( + offset(last, -0.5 * distance), + offset(offsets, 0.5 * distance + 10))); // safety offset + } + if (offsets.empty()) { + // Store the number of loops actually generated. + loop_number = i - 1; + // No region left to be filled in. + last.clear(); + break; + } else if (i > loop_number) { + // If i > loop_number, we were looking just for gaps. + break; + } + for (const ExPolygon &expolygon : offsets) { + contours[i].emplace_back(PerimeterGeneratorLoop(expolygon.contour, i, true)); + if (! expolygon.holes.empty()) { + holes[i].reserve(holes[i].size() + expolygon.holes.size()); + for (const Polygon &hole : expolygon.holes) + holes[i].emplace_back(PerimeterGeneratorLoop(hole, i, false)); } } + last = std::move(offsets); } - + // nest loops: holes first - for (int d = 0; d <= loop_number; ++d) { + for (int d = 0; d <= loop_number; ++ d) { PerimeterGeneratorLoops &holes_d = holes[d]; - // loop through all holes having depth == d - for (int i = 0; i < (int)holes_d.size(); ++i) { + for (int i = 0; i < (int)holes_d.size(); ++ i) { const PerimeterGeneratorLoop &loop = holes_d[i]; - // find the hole loop that contains this one, if any - for (int t = d+1; t <= loop_number; ++t) { - for (int j = 0; j < (int)holes[t].size(); ++j) { + for (int t = d + 1; t <= loop_number; ++ t) { + for (int j = 0; j < (int)holes[t].size(); ++ j) { PerimeterGeneratorLoop &candidate_parent = holes[t][j]; if (candidate_parent.polygon.contains(loop.polygon.first_point())) { candidate_parent.children.push_back(loop); holes_d.erase(holes_d.begin() + i); - --i; + -- i; goto NEXT_LOOP; } } } - // if no hole contains this hole, find the contour loop that contains it - for (int t = loop_number; t >= 0; --t) { - for (int j = 0; j < (int)contours[t].size(); ++j) { + for (int t = loop_number; t >= 0; -- t) { + for (int j = 0; j < (int)contours[t].size(); ++ j) { PerimeterGeneratorLoop &candidate_parent = contours[t][j]; if (candidate_parent.polygon.contains(loop.polygon.first_point())) { candidate_parent.children.push_back(loop); holes_d.erase(holes_d.begin() + i); - --i; + -- i; goto NEXT_LOOP; } } @@ -203,75 +167,57 @@ PerimeterGenerator::process() NEXT_LOOP: ; } } - // nest contour loops - for (int d = loop_number; d >= 1; --d) { + for (int d = loop_number; d >= 1; -- d) { PerimeterGeneratorLoops &contours_d = contours[d]; - // loop through all contours having depth == d - for (int i = 0; i < (int)contours_d.size(); ++i) { + for (int i = 0; i < (int)contours_d.size(); ++ i) { const PerimeterGeneratorLoop &loop = contours_d[i]; - // find the contour loop that contains it - for (int t = d-1; t >= 0; --t) { - for (int j = 0; j < contours[t].size(); ++j) { + for (int t = d - 1; t >= 0; -- t) { + for (int j = 0; j < contours[t].size(); ++ j) { PerimeterGeneratorLoop &candidate_parent = contours[t][j]; if (candidate_parent.polygon.contains(loop.polygon.first_point())) { candidate_parent.children.push_back(loop); contours_d.erase(contours_d.begin() + i); - --i; + -- i; goto NEXT_CONTOUR; } } } - NEXT_CONTOUR: ; } } - // at this point, all loops should be in contours[0] - ExtrusionEntityCollection entities = this->_traverse_loops(contours.front(), thin_walls); - // if brim will be printed, reverse the order of perimeters so that // we continue inwards after having finished the brim // TODO: add test for perimeter order - if (this->config->external_perimeters_first - || (this->layer_id == 0 && this->print_config->brim_width.value > 0)) - entities.reverse(); - + if (this->config->external_perimeters_first || + (this->layer_id == 0 && this->print_config->brim_width.value > 0)) + entities.reverse(); // append perimeters for this slice as a collection - if (!entities.empty()) + if (! entities.empty()) this->loops->append(entities); } // for each loop of an island // fill gaps - if (!gaps.empty()) { - /* - SVG svg("gaps.svg"); - svg.draw(union_ex(gaps)); - svg.Close(); - */ - + if (! gaps.empty()) { // collapse double min = 0.2 * perimeter_width * (1 - INSET_OVERLAP_TOLERANCE); double max = 2. * perimeter_spacing; ExPolygons gaps_ex = diff_ex( - offset2(gaps, -min/2, +min/2), - offset2(gaps, -max/2, +max/2), - true - ); - + //FIXME offset2 would be enough and cheaper. + offset2_ex(gaps, -min/2, +min/2), + offset2_ex(gaps, -max/2, +max/2), + true); ThickPolylines polylines; - for (ExPolygons::const_iterator ex = gaps_ex.begin(); ex != gaps_ex.end(); ++ex) - ex->medial_axis(max, min, &polylines); - - if (!polylines.empty()) { + for (const ExPolygon &ex : gaps_ex) + ex.medial_axis(max, min, &polylines); + if (! polylines.empty()) { ExtrusionEntityCollection gap_fill = this->_variable_width(polylines, erGapFill, this->solid_infill_flow); - this->gap_fill->append(gap_fill.entities); - /* Make sure we don't infill narrow parts that are already gap-filled (we only consider this surface's gaps to reduce the diff() complexity). Growing actual extrusions ensures that gaps not filled by medial axis @@ -280,7 +226,7 @@ PerimeterGenerator::process() and use zigzag). */ //FIXME Vojtech: This grows by a rounded extrusion width, not by line spacing, // therefore it may cover the area, but no the volume. - last = diff(last, gap_fill.polygons_covered_by_width(10.f)); + last = diff_ex(to_polygons(last), gap_fill.polygons_covered_by_width(10.f)); } } @@ -288,36 +234,34 @@ PerimeterGenerator::process() // we offset by half the perimeter spacing (to get to the actual infill boundary) // and then we offset back and forth by half the infill spacing to only consider the // non-collapsing regions - coord_t inset = 0; - if (loop_number == 0) { - // one loop - inset += ext_perimeter_spacing / 2; - } else if (loop_number > 0) { - // two or more loops - inset += perimeter_spacing / 2; - } + coord_t inset = + (loop_number < 0) ? 0 : + (loop_number == 0) ? + // one loop + ext_perimeter_spacing / 2 : + // two or more loops? + perimeter_spacing / 2; // only apply infill overlap if we actually have one perimeter if (inset > 0) inset -= this->config->get_abs_value("infill_overlap", inset + solid_infill_spacing / 2); // simplify infill contours according to resolution Polygons pp; - for (ExPolygon &ex : union_ex(last)) + for (ExPolygon &ex : last) ex.simplify_p(SCALED_RESOLUTION, &pp); // collapse too narrow infill areas - coord_t min_perimeter_infill_spacing = solid_infill_spacing * (1 - INSET_OVERLAP_TOLERANCE); + coord_t min_perimeter_infill_spacing = solid_infill_spacing * (1. - INSET_OVERLAP_TOLERANCE); // append infill areas to fill_surfaces this->fill_surfaces->append( offset2_ex( - pp, - -inset -min_perimeter_infill_spacing/2, - +min_perimeter_infill_spacing/2), + union_ex(pp), + - inset - min_perimeter_infill_spacing / 2, + min_perimeter_infill_spacing / 2), stInternal); } // for each island } -ExtrusionEntityCollection -PerimeterGenerator::_traverse_loops(const PerimeterGeneratorLoops &loops, - ThickPolylines &thin_walls) const +ExtrusionEntityCollection PerimeterGenerator::_traverse_loops( + const PerimeterGeneratorLoops &loops, ThickPolylines &thin_walls) const { // loops is an arrayref of ::Loop objects // turn each one into an ExtrusionLoop object @@ -422,8 +366,7 @@ PerimeterGenerator::_traverse_loops(const PerimeterGeneratorLoops &loops, return entities; } -ExtrusionEntityCollection -PerimeterGenerator::_variable_width(const ThickPolylines &polylines, ExtrusionRole role, Flow flow) const +ExtrusionEntityCollection PerimeterGenerator::_variable_width(const ThickPolylines &polylines, ExtrusionRole role, Flow flow) const { // this value determines granularity of adaptive width, as G-code does not allow // variable extrusion within a single move; this value shall only affect the amount @@ -431,10 +374,10 @@ PerimeterGenerator::_variable_width(const ThickPolylines &polylines, ExtrusionRo const double tolerance = scale_(0.05); ExtrusionEntityCollection coll; - for (ThickPolylines::const_iterator p = polylines.begin(); p != polylines.end(); ++p) { + for (const ThickPolyline &p : polylines) { ExtrusionPaths paths; ExtrusionPath path(role); - ThickLines lines = p->thicklines(); + ThickLines lines = p.thicklines(); for (int i = 0; i < (int)lines.size(); ++i) { const ThickLine& line = lines[i]; @@ -474,12 +417,11 @@ PerimeterGenerator::_variable_width(const ThickPolylines &polylines, ExtrusionRo lines.insert(lines.begin() + i + j, new_line); } - --i; + -- i; continue; } const double w = fmax(line.a_width, line.b_width); - if (path.polyline.points.empty()) { path.polyline.append(line.a); path.polyline.append(line.b); @@ -497,21 +439,19 @@ PerimeterGenerator::_variable_width(const ThickPolylines &polylines, ExtrusionRo if (thickness_delta <= tolerance) { // the width difference between this line and the current flow width is // within the accepted tolerance - path.polyline.append(line.b); } else { // we need to initialize a new line - paths.push_back(path); + paths.emplace_back(std::move(path)); path = ExtrusionPath(role); - --i; + -- i; } } } if (path.polyline.is_valid()) - paths.push_back(path); - - // append paths to collection - if (!paths.empty()) { + paths.emplace_back(std::move(path)); + // Append paths to collection. + if (! paths.empty()) { if (paths.front().first_point().coincides_with(paths.back().last_point())) coll.append(ExtrusionLoop(paths)); else @@ -522,20 +462,15 @@ PerimeterGenerator::_variable_width(const ThickPolylines &polylines, ExtrusionRo return coll; } -bool -PerimeterGeneratorLoop::is_internal_contour() const +bool PerimeterGeneratorLoop::is_internal_contour() const { - if (this->is_contour) { - // an internal contour is a contour containing no other contours - for (std::vector::const_iterator loop = this->children.begin(); - loop != this->children.end(); ++loop) { - if (loop->is_contour) { - return false; - } - } - return true; - } - return false; + // An internal contour is a contour containing no other contours + if (! this->is_contour) + return false; + for (const PerimeterGeneratorLoop &loop : this->children) + if (loop.is_contour) + return false; + return true; } } From 5e1e43f47842314b2785956a99d5b344ef7229af Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 18 May 2018 13:56:51 +0200 Subject: [PATCH 23/63] Resolved problem with Flickering. Right column of the Plater is passed to own panel to be able be updated separately from whole Plater panel --- lib/Slic3r/GUI/Plater.pm | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index be1e02021..e141c7732 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -225,9 +225,12 @@ sub new { $self->{btoolbar}->Add($self->{"btn_layer_editing"}); } + ### Panel for right column + $self->{right_panel} = Wx::Panel->new($self, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + ### Scrolled Window for info boxes my $scrolled_window_sizer = Wx::BoxSizer->new(wxVERTICAL); - my $scrolled_window_panel = Wx::ScrolledWindow->new($self, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + my $scrolled_window_panel = Wx::ScrolledWindow->new($self->{right_panel}, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); $scrolled_window_panel->SetSizer($scrolled_window_sizer); $scrolled_window_panel->SetScrollbars(1, 1, 1, 1); @@ -249,11 +252,11 @@ sub new { }); # right pane buttons - $self->{btn_export_gcode} = Wx::Button->new($self, -1, L("Export G-code…"), wxDefaultPosition, [-1, 30], wxBU_LEFT); - $self->{btn_reslice} = Wx::Button->new($self, -1, L("Slice now"), wxDefaultPosition, [-1, 30], wxBU_LEFT); - $self->{btn_print} = Wx::Button->new($self, -1, L("Print…"), wxDefaultPosition, [-1, 30], wxBU_LEFT); - $self->{btn_send_gcode} = Wx::Button->new($self, -1, L("Send to printer"), wxDefaultPosition, [-1, 30], wxBU_LEFT); - $self->{btn_export_stl} = Wx::Button->new($self, -1, L("Export STL…"), wxDefaultPosition, [-1, 30], wxBU_LEFT); + $self->{btn_export_gcode} = Wx::Button->new($self->{right_panel}, -1, L("Export G-code…"), wxDefaultPosition, [-1, 30], wxBU_LEFT); + $self->{btn_reslice} = Wx::Button->new($self->{right_panel}, -1, L("Slice now"), wxDefaultPosition, [-1, 30], wxBU_LEFT); + $self->{btn_print} = Wx::Button->new($self->{right_panel}, -1, L("Print…"), wxDefaultPosition, [-1, 30], wxBU_LEFT); + $self->{btn_send_gcode} = Wx::Button->new($self->{right_panel}, -1, L("Send to printer"), wxDefaultPosition, [-1, 30], wxBU_LEFT); + $self->{btn_export_stl} = Wx::Button->new($self->{right_panel}, -1, L("Export STL…"), wxDefaultPosition, [-1, 30], wxBU_LEFT); #$self->{btn_export_gcode}->SetFont($Slic3r::GUI::small_font); #$self->{btn_export_stl}->SetFont($Slic3r::GUI::small_font); $self->{btn_print}->Hide; @@ -390,9 +393,9 @@ sub new { # $self->{preset_choosers}{$group}[$idx] $self->{preset_choosers} = {}; for my $group (qw(print filament printer)) { - my $text = Wx::StaticText->new($self, -1, "$group_labels{$group}:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); + my $text = Wx::StaticText->new($self->{right_panel}, -1, "$group_labels{$group}:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); $text->SetFont($Slic3r::GUI::small_font); - my $choice = Wx::BitmapComboBox->new($self, -1, "", wxDefaultPosition, wxDefaultSize, [], wxCB_READONLY); + my $choice = Wx::BitmapComboBox->new($self->{right_panel}, -1, "", wxDefaultPosition, wxDefaultSize, [], wxCB_READONLY); if ($group eq 'filament') { EVT_LEFT_DOWN($choice, sub { $self->filament_color_box_lmouse_down(0, @_); } ); } @@ -410,7 +413,7 @@ sub new { } my $frequently_changed_parameters_sizer = Wx::BoxSizer->new(wxHORIZONTAL); - Slic3r::GUI::add_frequently_changed_parameters($self, $frequently_changed_parameters_sizer, $presets); + Slic3r::GUI::add_frequently_changed_parameters($self->{right_panel}, $frequently_changed_parameters_sizer, $presets); my $object_info_sizer; { @@ -514,9 +517,12 @@ sub new { # Show the box initially, let it be shown after the slicing is finished. $self->{"print_info_box_show"}->(0); + $right_sizer->SetSizeHints($self->{right_panel}); + $self->{right_panel}->SetSizer($right_sizer); + my $hsizer = Wx::BoxSizer->new(wxHORIZONTAL); $hsizer->Add($self->{preview_notebook}, 1, wxEXPAND | wxTOP, 1); - $hsizer->Add($right_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, 3); + $hsizer->Add($self->{right_panel}, 0, wxEXPAND | wxLEFT | wxRIGHT, 3); my $sizer = Wx::BoxSizer->new(wxVERTICAL); $sizer->Add($self->{htoolbar}, 0, wxEXPAND, 0) if $self->{htoolbar}; @@ -1976,7 +1982,7 @@ sub selection_changed { my ($obj_idx, $object) = $self->selected_object; my $have_sel = defined $obj_idx; - $self->Freeze; + $self->{right_panel}->Freeze; if ($self->{htoolbar}) { # On OSX or Linux $self->{htoolbar}->EnableTool($_, $have_sel) @@ -2030,7 +2036,7 @@ sub selection_changed { # prepagate the event to the frame (a custom Wx event would be cleaner) $self->GetFrame->on_plater_selection_changed($have_sel); - $self->Thaw; + $self->{right_panel}->Thaw; } sub select_object { From fd43e53aeb67b6ad0b3e25b25af2702694b45917 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Fri, 18 May 2018 14:58:24 +0200 Subject: [PATCH 24/63] PresetUpdater: Add some more logging --- xs/src/slic3r/Utils/PresetUpdater.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/xs/src/slic3r/Utils/PresetUpdater.cpp b/xs/src/slic3r/Utils/PresetUpdater.cpp index a5208e3c2..9a4d1048f 100644 --- a/xs/src/slic3r/Utils/PresetUpdater.cpp +++ b/xs/src/slic3r/Utils/PresetUpdater.cpp @@ -402,7 +402,11 @@ void PresetUpdater::priv::perform_updates(Updates &&updates, bool snapshot) cons PresetBundle bundle; bundle.load_configbundle(update.target.string(), PresetBundle::LOAD_CFGBNDLE_SYSTEM); + BOOST_LOG_TRIVIAL(info) << boost::format("Deleting %1% conflicting presets") + % (bundle.prints.size() + bundle.filaments.size() + bundle.printers.size()); + auto preset_remover = [](const Preset &preset) { + BOOST_LOG_TRIVIAL(info) << '\t' << preset.file; fs::remove(preset.file); }; @@ -411,9 +415,14 @@ void PresetUpdater::priv::perform_updates(Updates &&updates, bool snapshot) cons for (const auto &preset : bundle.printers) { preset_remover(preset); } // Also apply the `obsolete_presets` property, removing obsolete ini files + + BOOST_LOG_TRIVIAL(info) << boost::format("Deleting %1% obsolete presets") + % (bundle.obsolete_presets.prints.size() + bundle.obsolete_presets.filaments.size() + bundle.obsolete_presets.printers.size()); + auto obsolete_remover = [](const char *subdir, const std::string &preset) { auto path = fs::path(Slic3r::data_dir()) / subdir / preset; path += ".ini"; + BOOST_LOG_TRIVIAL(info) << '\t' << path.string(); fs::remove(path); }; From deabeaaa7fc48691c9b778e11a725f7bd93a0458 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Sun, 20 May 2018 23:39:52 +0200 Subject: [PATCH 25/63] Aligned frequently changing parameters according to presets settings on the Plater tab. Fixed missing adding of the Filaments preset settings(for multy material case) to the right_panel --- lib/Slic3r/GUI/Plater.pm | 3 ++- xs/src/slic3r/GUI/GUI.cpp | 4 ++-- xs/src/slic3r/GUI/OptionsGroup.cpp | 10 +++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index e141c7732..a2c3b094e 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -410,6 +410,7 @@ sub new { $presets->Add($text, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL | wxRIGHT, 4); $presets->Add($choice, 1, wxALIGN_CENTER_VERTICAL | wxEXPAND | wxBOTTOM, 1); } + $presets->Layout; } my $frequently_changed_parameters_sizer = Wx::BoxSizer->new(wxHORIZONTAL); @@ -1738,7 +1739,7 @@ sub on_extruders_change { my @presets = $choices->[0]->GetStrings; # initialize new choice - my $choice = Wx::BitmapComboBox->new($self, -1, "", wxDefaultPosition, wxDefaultSize, [@presets], wxCB_READONLY); + my $choice = Wx::BitmapComboBox->new($self->{right_panel}, -1, "", wxDefaultPosition, wxDefaultSize, [@presets], wxCB_READONLY); my $extruder_idx = scalar @$choices; EVT_LEFT_DOWN($choice, sub { $self->filament_color_box_lmouse_down($extruder_idx, @_); } ); push @$choices, $choice; diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index 4789f4590..a744bb09d 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -809,8 +809,8 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl { DynamicPrintConfig* config = &g_PresetBundle->prints.get_edited_preset().config; m_optgroup = std::make_shared(parent, "", config); -// const wxArrayInt& ar = preset_sizer->GetColWidths(); -// m_optgroup->label_width = ar.IsEmpty() ? 100 : ar.front(); // doesn't work + const wxArrayInt& ar = preset_sizer->GetColWidths(); + m_optgroup->label_width = ar.IsEmpty() ? 100 : ar.front()-4; // doesn't work m_optgroup->m_on_change = [config](t_config_option_key opt_key, boost::any value){ TabPrint* tab_print = nullptr; for (size_t i = 0; i < g_wxTabPanel->GetPageCount(); ++i) { diff --git a/xs/src/slic3r/GUI/OptionsGroup.cpp b/xs/src/slic3r/GUI/OptionsGroup.cpp index 657ad03c0..57659d03d 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.cpp +++ b/xs/src/slic3r/GUI/OptionsGroup.cpp @@ -150,11 +150,11 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** colored_Label/* // Build a label if we have it wxStaticText* label=nullptr; if (label_width != 0) { - label = new wxStaticText(parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ": "), - wxDefaultPosition, staticbox ? wxSize(label_width, -1) : wxDefaultSize); + label = new wxStaticText(parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ":"), + wxDefaultPosition, wxSize(label_width, -1), staticbox ? 0 : wxALIGN_RIGHT); label->SetFont(label_font); label->Wrap(label_width); // avoid a Linux/GTK bug - grid_sizer->Add(label, 0, (staticbox ? 0 : wxALIGN_RIGHT) | wxALIGN_CENTER_VERTICAL, 0); + grid_sizer->Add(label, 0, (staticbox ? 0 : wxALIGN_RIGHT | wxRIGHT) | wxALIGN_CENTER_VERTICAL, 5); if (line.label_tooltip.compare("") != 0) label->SetToolTip(line.label_tooltip); } @@ -170,7 +170,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** colored_Label/* // if we have a single option with no sidetext just add it directly to the grid sizer auto sizer = new wxBoxSizer(wxHORIZONTAL); - grid_sizer->Add(sizer, 0, wxEXPAND | wxALL, 0); + grid_sizer->Add(sizer, 0, wxEXPAND | (staticbox ? wxALL : wxBOTTOM|wxTOP|wxLEFT), staticbox ? 0 : 1); if (option_set.size() == 1 && option_set.front().opt.sidetext.size() == 0 && option_set.front().side_widget == nullptr && line.get_extra_widgets().size() == 0) { const auto& option = option_set.front(); @@ -180,7 +180,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** colored_Label/* sizer->Add(field->m_Undo_btn, 0, wxALIGN_CENTER_VERTICAL); if (is_window_field(field)) sizer->Add(field->getWindow(), option.opt.full_width ? 1 : 0, (option.opt.full_width ? wxEXPAND : 0) | - wxBOTTOM | wxTOP | wxALIGN_CENTER_VERTICAL, wxOSX ? 0 : 2); + wxBOTTOM | wxTOP | wxALIGN_CENTER_VERTICAL, (wxOSX||!staticbox) ? 0 : 2); if (is_sizer_field(field)) sizer->Add(field->getSizer(), 0, (option.opt.full_width ? wxEXPAND : 0) | wxALIGN_CENTER_VERTICAL, 0); return; From 53ddf724e1c3040b894af3e5d875fedeb387ced8 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 21 May 2018 10:51:47 +0200 Subject: [PATCH 26/63] Fixed object setting dialog on NVIDIA cards --- lib/Slic3r/GUI/Plater/ObjectSettingsDialog.pm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/Slic3r/GUI/Plater/ObjectSettingsDialog.pm b/lib/Slic3r/GUI/Plater/ObjectSettingsDialog.pm index 908d5eff7..61a8f2a01 100644 --- a/lib/Slic3r/GUI/Plater/ObjectSettingsDialog.pm +++ b/lib/Slic3r/GUI/Plater/ObjectSettingsDialog.pm @@ -46,6 +46,8 @@ sub new { $self->SetSizer($sizer); $self->SetMinSize($self->GetSize); + $self->Layout; + wxTheApp->restore_window_pos($self, "object_settings"); return $self; From 308a0b5709086350e423afa258f7e2b1ad3bb440 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 21 May 2018 11:50:48 +0200 Subject: [PATCH 27/63] Remember output directory default value set to true --- xs/src/slic3r/GUI/Preferences.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xs/src/slic3r/GUI/Preferences.cpp b/xs/src/slic3r/GUI/Preferences.cpp index cb7ac92a6..2500afa13 100644 --- a/xs/src/slic3r/GUI/Preferences.cpp +++ b/xs/src/slic3r/GUI/Preferences.cpp @@ -35,8 +35,8 @@ void PreferencesDialog::build() def.type = coBool; def.tooltip = L("If this is enabled, Slic3r will prompt the last output directory " "instead of the one containing the input files."); - def.default_value = new ConfigOptionBool{ app_config->get("remember_output_path")[0] == '1' }; // 1; - Option option(def, "remember_output_path"); + def.default_value = new ConfigOptionBool{ app_config->has("remember_output_path") ? app_config->get("remember_output_path")[0] == '1' : true }; // 1; + Option option(def, "remember_output_path"); m_optgroup->append_single_option_line(option); def.label = L("Auto-center parts"); From 64b905820d00bad48b43f7d5ba36848462814976 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 21 May 2018 12:34:31 +0200 Subject: [PATCH 28/63] Fixed bugs with non-correct update of buttons enable. Set minimum size for the scrolled_window_panel. --- lib/Slic3r/GUI/Plater.pm | 1 + lib/Slic3r/GUI/Plater/3D.pm | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index a2c3b094e..0fa651b19 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -230,6 +230,7 @@ sub new { ### Scrolled Window for info boxes my $scrolled_window_sizer = Wx::BoxSizer->new(wxVERTICAL); + $scrolled_window_sizer->SetMinSize([310, -1]); my $scrolled_window_panel = Wx::ScrolledWindow->new($self->{right_panel}, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); $scrolled_window_panel->SetSizer($scrolled_window_sizer); $scrolled_window_panel->SetScrollbars(1, 1, 1, 1); diff --git a/lib/Slic3r/GUI/Plater/3D.pm b/lib/Slic3r/GUI/Plater/3D.pm index c9c954276..c3521a4da 100644 --- a/lib/Slic3r/GUI/Plater/3D.pm +++ b/lib/Slic3r/GUI/Plater/3D.pm @@ -245,7 +245,7 @@ sub reload_scene { $self->set_warning_enabled(0); $self->volumes->update_outside_state($self->{config}, 1); Slic3r::GUI::_3DScene::reset_warning_texture(); - $self->on_enable_action_buttons->(1) if ($self->on_enable_action_buttons); + $self->on_enable_action_buttons->(scalar @{$self->{model}->objects} > 0) if ($self->on_enable_action_buttons); } } else { $self->set_warning_enabled(0); From c4478ccffaed4a6ca3ffff324df90f523bec2152 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 21 May 2018 14:36:09 +0200 Subject: [PATCH 29/63] Fixed wrong updating of the options group tree --- xs/src/slic3r/GUI/Tab.cpp | 24 ++++++++++++++---------- xs/src/slic3r/GUI/Tab.hpp | 1 + 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 5a47dd1e7..38c97f25e 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -1709,7 +1709,8 @@ void TabPrinter::build_extruder_pages(){ size_t n_before_extruders = 2; // Count of pages before Extruder pages size_t n_after_single_extruder_MM = 2; // Count of pages after single_extruder_multi_material page - if (m_extruders_count_old == m_extruders_count || m_extruders_count <= 2) + if (m_extruders_count_old == m_extruders_count || + (m_has_single_extruder_MM_page && m_extruders_count == 1)) { // if we have a single extruder MM setup, add a page with configuration options: for (int i = 0; i < m_pages.size(); ++i) // first make sure it's not there already @@ -1717,16 +1718,19 @@ void TabPrinter::build_extruder_pages(){ m_pages.erase(m_pages.begin() + i); break; } - if (m_extruders_count > 1 && m_config->opt_bool("single_extruder_multi_material")) { - // create a page, but pretend it's an extruder page, so we can add it to m_pages ourselves - auto page = add_options_page(_(L("Single extruder MM setup")), "printer_empty.png", true); - auto optgroup = page->new_optgroup(_(L("Single extruder multimaterial parameters"))); - optgroup->append_single_option_line("cooling_tube_retraction"); - optgroup->append_single_option_line("cooling_tube_length"); - optgroup->append_single_option_line("parking_pos_retraction"); - m_pages.insert(m_pages.end() - n_after_single_extruder_MM, page); - } + m_has_single_extruder_MM_page = false; } + if (m_extruders_count > 1 && m_config->opt_bool("single_extruder_multi_material") && !m_has_single_extruder_MM_page) { + // create a page, but pretend it's an extruder page, so we can add it to m_pages ourselves + auto page = add_options_page(_(L("Single extruder MM setup")), "printer_empty.png", true); + auto optgroup = page->new_optgroup(_(L("Single extruder multimaterial parameters"))); + optgroup->append_single_option_line("cooling_tube_retraction"); + optgroup->append_single_option_line("cooling_tube_length"); + optgroup->append_single_option_line("parking_pos_retraction"); + m_pages.insert(m_pages.end() - n_after_single_extruder_MM, page); + m_has_single_extruder_MM_page = true; + } + for (auto extruder_idx = m_extruders_count_old; extruder_idx < m_extruders_count; ++extruder_idx){ //# build page diff --git a/xs/src/slic3r/GUI/Tab.hpp b/xs/src/slic3r/GUI/Tab.hpp index 62030bce3..d6bf2cf43 100644 --- a/xs/src/slic3r/GUI/Tab.hpp +++ b/xs/src/slic3r/GUI/Tab.hpp @@ -312,6 +312,7 @@ public: //Slic3r::GUI::Tab::Printer; class TabPrinter : public Tab { + bool m_has_single_extruder_MM_page = false; public: wxButton* m_serial_test_btn; wxButton* m_octoprint_host_test_btn; From 1caeab913bdbd8c8940dcb96c5ce29c46bb51cd5 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Thu, 19 Apr 2018 10:35:47 +0200 Subject: [PATCH 30/63] avrdude base --- xs/src/avrdude/AUTHORS | 28 + xs/src/avrdude/BUILD-FROM-SVN | 13 + xs/src/avrdude/COPYING | 339 + xs/src/avrdude/ChangeLog | 90 + xs/src/avrdude/ChangeLog-2001 | 598 + xs/src/avrdude/ChangeLog-2002 | 237 + xs/src/avrdude/ChangeLog-2003 | 1095 ++ xs/src/avrdude/ChangeLog-2004-2006 | 1644 ++ xs/src/avrdude/ChangeLog-2007 | 364 + xs/src/avrdude/ChangeLog-2008 | 185 + xs/src/avrdude/ChangeLog-2009 | 411 + xs/src/avrdude/ChangeLog-2010 | 354 + xs/src/avrdude/ChangeLog-2011 | 489 + xs/src/avrdude/ChangeLog-2012 | 729 + xs/src/avrdude/ChangeLog-2013 | 618 + xs/src/avrdude/ChangeLog-2014 | 697 + xs/src/avrdude/ChangeLog-2015 | 54 + xs/src/avrdude/Makefile.am | 206 + xs/src/avrdude/NEWS | 913 + xs/src/avrdude/README | 64 + xs/src/avrdude/ac_cfg.h | 195 + xs/src/avrdude/ac_cfg.h.in | 194 + xs/src/avrdude/arduino.c | 132 + xs/src/avrdude/arduino.h | 29 + xs/src/avrdude/atmel-docs/AVR109.pdf | Bin 0 -> 94446 bytes xs/src/avrdude/atmel-docs/AVR910.pdf | Bin 0 -> 224606 bytes .../avrdude/atmel-docs/AVRISPmkII-AVR069.pdf | Bin 0 -> 326430 bytes .../atmel-docs/EDBG/common/browserDetect.js | 116 + .../atmel-docs/EDBG/common/css/960.css | 1 + .../atmel-docs/EDBG/common/css/docbook.css | 227 + .../atmel-docs/EDBG/common/css/fluid_grid.css | 154 + .../atmel-docs/EDBG/common/css/index.css | 59 + .../EDBG/common/css/positioning.css | 493 + .../atmel-docs/EDBG/common/css/print.css | 28 + .../atmel-docs/EDBG/common/css/reset.css | 1 + .../atmel-docs/EDBG/common/css/text.css | 1 + .../EDBG/common/fonts/DroidSansMono.eot | Bin 0 -> 78514 bytes .../EDBG/common/fonts/DroidSansMono.ttf | Bin 0 -> 78296 bytes .../EDBG/common/images/Book_Closed.png | Bin 0 -> 3245 bytes .../EDBG/common/images/Book_Open.png | Bin 0 -> 703 bytes .../EDBG/common/images/Document_Text.png | Bin 0 -> 583 bytes .../atmel-docs/EDBG/common/images/Library.png | Bin 0 -> 798 bytes .../EDBG/common/images/external_link.gif | Bin 0 -> 98 bytes .../atmel-docs/EDBG/common/images/loading.gif | Bin 0 -> 1553 bytes .../atmel-docs/EDBG/common/images/logo.png | Bin 0 -> 4305 bytes .../atmel-docs/EDBG/common/images/minus.png | Bin 0 -> 156 bytes .../EDBG/common/images/next-arrow.png | Bin 0 -> 199 bytes .../atmel-docs/EDBG/common/images/plus.png | Bin 0 -> 164 bytes .../EDBG/common/images/previous-arrow.png | Bin 0 -> 198 bytes .../EDBG/common/images/search-icon.png | Bin 0 -> 340 bytes .../atmel-docs/EDBG/common/images/sidebar.png | Bin 0 -> 177 bytes .../EDBG/common/images/starsSmall.png | Bin 0 -> 1032 bytes .../EDBG/common/images/toc-icon.png | Bin 0 -> 3447 bytes .../common/images/ui-icons_217bc0_256x240.png | Bin 0 -> 4369 bytes .../EDBG/common/jquery/jquery-1.7.2.min.js | 4 + .../EDBG/common/jquery/jquery.cookie.js | 93 + .../EDBG/common/jquery/jquery.ui.all.js | 418 + .../common/jquery/layout/jquery.layout.js | 5449 ++++++ .../images/ui-anim_basic_16x16.gif | Bin 0 -> 1553 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_55_fbec88_40x100.png | Bin 0 -> 182 bytes .../images/ui-bg_glass_75_d0e5f5_1x400.png | Bin 0 -> 162 bytes .../images/ui-bg_glass_85_dfeffc_1x400.png | Bin 0 -> 123 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_gloss-wave_55_5c9ccc_500x100.png | Bin 0 -> 3457 bytes .../ui-bg_inset-hard_100_f5f8f9_1x100.png | Bin 0 -> 104 bytes .../ui-bg_inset-hard_100_fcfdfd_1x100.png | Bin 0 -> 88 bytes .../images/ui-icons_217bc0_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_469bdd_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_6da8d5_256x240.png | Bin 0 -> 5355 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_d8e7f3_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_f9bd01_256x240.png | Bin 0 -> 5355 bytes .../theme-redmond/jquery-ui-1.8.2.custom.css | 398 + .../common/jquery/treeview/images/file.gif | Bin 0 -> 1008 bytes .../jquery/treeview/images/folder-closed.gif | Bin 0 -> 631 bytes .../common/jquery/treeview/images/folder.gif | Bin 0 -> 631 bytes .../treeview/images/treeview-black-line.gif | Bin 0 -> 1877 bytes .../jquery/treeview/images/treeview-black.gif | Bin 0 -> 1216 bytes .../treeview/images/treeview-default-line.gif | Bin 0 -> 1993 bytes .../treeview/images/treeview-default.gif | Bin 0 -> 1222 bytes .../images/treeview-famfamfam-line.gif | Bin 0 -> 807 bytes .../treeview/images/treeview-famfamfam.gif | Bin 0 -> 1280 bytes .../treeview/images/treeview-gray-line.gif | Bin 0 -> 1877 bytes .../jquery/treeview/images/treeview-gray.gif | Bin 0 -> 1230 bytes .../treeview/images/treeview-red-line.gif | Bin 0 -> 1877 bytes .../jquery/treeview/images/treeview-red.gif | Bin 0 -> 1230 bytes .../jquery/treeview/jquery.treeview.css | 85 + .../jquery/treeview/jquery.treeview.min.js | 16 + xs/src/avrdude/atmel-docs/EDBG/common/main.js | 282 + .../atmel-docs/EDBG/common/splitterInit.js | 40 + .../atmel-docs/EDBG/protocoldocs/ch01s01.html | 218 + .../atmel-docs/EDBG/protocoldocs/ch01s02.html | 234 + .../atmel-docs/EDBG/protocoldocs/ch02s01.html | 212 + .../atmel-docs/EDBG/protocoldocs/ch02s02.html | 213 + .../EDBG/protocoldocs/ch02s02s01.html | 211 + .../EDBG/protocoldocs/ch02s02s02.html | 211 + .../EDBG/protocoldocs/ch02s02s02s01.html | 212 + .../EDBG/protocoldocs/ch02s02s02s02.html | 211 + .../EDBG/protocoldocs/ch02s02s03.html | 211 + .../EDBG/protocoldocs/ch02s02s03s01.html | 211 + .../EDBG/protocoldocs/ch02s02s03s02.html | 211 + .../EDBG/protocoldocs/ch02s02s03s03.html | 211 + .../EDBG/protocoldocs/ch02s02s03s04.html | 211 + .../EDBG/protocoldocs/ch02s03s01.html | 214 + .../EDBG/protocoldocs/ch02s03s02.html | 214 + .../EDBG/protocoldocs/ch02s03s03.html | 212 + .../EDBG/protocoldocs/ch02s03s04.html | 212 + .../EDBG/protocoldocs/ch02s03s05.html | 212 + .../EDBG/protocoldocs/ch02s03s06.html | 216 + .../EDBG/protocoldocs/ch02s03s07.html | 214 + .../EDBG/protocoldocs/ch02s03s08.html | 211 + .../EDBG/protocoldocs/ch02s03s09.html | 211 + .../atmel-docs/EDBG/protocoldocs/ch02s04.html | 216 + .../EDBG/protocoldocs/ch02s04s01.html | 216 + .../EDBG/protocoldocs/ch02s04s02.html | 218 + .../EDBG/protocoldocs/ch02s04s03.html | 214 + .../atmel-docs/EDBG/protocoldocs/ch03s01.html | 211 + .../EDBG/protocoldocs/ch03s01s01.html | 215 + .../EDBG/protocoldocs/ch03s01s01.html~ | 215 + .../EDBG/protocoldocs/ch03s01s02.html | 216 + .../EDBG/protocoldocs/ch03s01s03.html | 216 + .../EDBG/protocoldocs/ch03s01s03s01.html | 211 + .../atmel-docs/EDBG/protocoldocs/ch03s02.html | 211 + .../EDBG/protocoldocs/ch03s02s01.html | 211 + .../EDBG/protocoldocs/ch03s02s02.html | 211 + .../EDBG/protocoldocs/ch03s02s03.html | 212 + .../EDBG/protocoldocs/ch03s02s04.html | 211 + .../atmel-docs/EDBG/protocoldocs/ch04s01.html | 212 + .../atmel-docs/EDBG/protocoldocs/ch04s02.html | 228 + .../atmel-docs/EDBG/protocoldocs/ch04s03.html | 218 + .../atmel-docs/EDBG/protocoldocs/ch04s04.html | 212 + .../EDBG/protocoldocs/ch04s04s01.html | 215 + .../EDBG/protocoldocs/ch04s04s03.html | 211 + .../EDBG/protocoldocs/ch04s04s04.html | 211 + .../EDBG/protocoldocs/ch04s04s05.html | 236 + .../atmel-docs/EDBG/protocoldocs/ch04s05.html | 213 + .../EDBG/protocoldocs/ch04s05s01.html | 215 + .../EDBG/protocoldocs/ch04s05s03.html | 216 + .../EDBG/protocoldocs/ch04s05s04.html | 216 + .../EDBG/protocoldocs/ch04s05s06.html | 211 + .../EDBG/protocoldocs/ch04s05s06s02.html | 213 + .../EDBG/protocoldocs/ch04s05s06s03.html | 213 + .../EDBG/protocoldocs/ch04s05s06s04.html | 217 + .../EDBG/protocoldocs/ch04s05s06s05.html | 217 + .../EDBG/protocoldocs/ch04s05s07.html | 211 + .../EDBG/protocoldocs/ch04s05s07s01.html | 211 + .../EDBG/protocoldocs/ch04s05s07s02.html | 211 + .../EDBG/protocoldocs/ch04s05s07s03.html | 213 + .../EDBG/protocoldocs/ch04s05s07s04.html | 211 + .../EDBG/protocoldocs/ch04s05s08.html | 211 + .../EDBG/protocoldocs/ch04s05s08s01.html | 213 + .../EDBG/protocoldocs/ch04s05s08s02.html | 214 + .../EDBG/protocoldocs/ch04s05s08s03.html | 211 + .../EDBG/protocoldocs/ch04s05s09.html | 220 + .../EDBG/protocoldocs/ch04s05s10.html | 310 + .../atmel-docs/EDBG/protocoldocs/ch05s01.html | 211 + .../EDBG/protocoldocs/ch05s01s01.html | 215 + .../EDBG/protocoldocs/ch05s01s02.html | 216 + .../EDBG/protocoldocs/ch05s01s03.html | 216 + .../EDBG/protocoldocs/ch05s01s04.html | 216 + .../EDBG/protocoldocs/ch05s01s05.html | 213 + .../EDBG/protocoldocs/ch05s01s06.html | 215 + .../EDBG/protocoldocs/ch05s01s07.html | 213 + .../EDBG/protocoldocs/ch05s01s08.html | 213 + .../EDBG/protocoldocs/ch05s01s09.html | 214 + .../EDBG/protocoldocs/ch05s01s10.html | 213 + .../EDBG/protocoldocs/ch05s01s11.html | 214 + .../EDBG/protocoldocs/ch05s01s12.html | 214 + .../EDBG/protocoldocs/ch05s01s13.html | 215 + .../EDBG/protocoldocs/ch05s01s14.html | 217 + .../EDBG/protocoldocs/ch05s01s15.html | 216 + .../atmel-docs/EDBG/protocoldocs/ch05s02.html | 211 + .../EDBG/protocoldocs/ch05s02s01.html | 211 + .../EDBG/protocoldocs/ch05s02s02.html | 211 + .../EDBG/protocoldocs/ch05s02s03.html | 211 + .../EDBG/protocoldocs/ch05s02s04.html | 211 + .../EDBG/protocoldocs/ch05s02s05.html | 212 + .../EDBG/protocoldocs/ch05s02s06.html | 211 + .../atmel-docs/EDBG/protocoldocs/ch05s03.html | 211 + .../EDBG/protocoldocs/ch05s03s01.html | 219 + .../EDBG/protocoldocs/ch05s03s02.html | 224 + .../EDBG/protocoldocs/ch05s03s03.html | 214 + .../atmel-docs/EDBG/protocoldocs/ch05s04.html | 360 + .../atmel-docs/EDBG/protocoldocs/ch06s01.html | 211 + .../EDBG/protocoldocs/ch06s01s01.html | 215 + .../EDBG/protocoldocs/ch06s01s02.html | 216 + .../EDBG/protocoldocs/ch06s01s03.html | 216 + .../EDBG/protocoldocs/ch06s01s04.html | 217 + .../EDBG/protocoldocs/ch06s01s05.html | 213 + .../EDBG/protocoldocs/ch06s01s06.html | 215 + .../EDBG/protocoldocs/ch06s01s07.html | 213 + .../EDBG/protocoldocs/ch06s01s08.html | 213 + .../EDBG/protocoldocs/ch06s01s09.html | 215 + .../EDBG/protocoldocs/ch06s01s10.html | 214 + .../EDBG/protocoldocs/ch06s01s11.html | 213 + .../EDBG/protocoldocs/ch06s01s12.html | 215 + .../EDBG/protocoldocs/ch06s01s13.html | 216 + .../EDBG/protocoldocs/ch06s01s14.html | 213 + .../EDBG/protocoldocs/ch06s01s15.html | 213 + .../EDBG/protocoldocs/ch06s01s16.html | 213 + .../EDBG/protocoldocs/ch06s01s17.html | 217 + .../EDBG/protocoldocs/ch06s01s18.html | 215 + .../EDBG/protocoldocs/ch06s01s19.html | 220 + .../EDBG/protocoldocs/ch06s01s20.html | 216 + .../EDBG/protocoldocs/ch06s01s21.html | 214 + .../EDBG/protocoldocs/ch06s01s22.html | 215 + .../EDBG/protocoldocs/ch06s01s23.html | 215 + .../EDBG/protocoldocs/ch06s01s24.html | 214 + .../EDBG/protocoldocs/ch06s01s25.html | 213 + .../EDBG/protocoldocs/ch06s01s26.html | 213 + .../EDBG/protocoldocs/ch06s01s27.html | 216 + .../EDBG/protocoldocs/ch06s01s28.html | 216 + .../EDBG/protocoldocs/ch06s01s29.html | 214 + .../atmel-docs/EDBG/protocoldocs/ch06s02.html | 211 + .../EDBG/protocoldocs/ch06s02s01.html | 211 + .../EDBG/protocoldocs/ch06s02s02.html | 211 + .../EDBG/protocoldocs/ch06s02s03.html | 211 + .../EDBG/protocoldocs/ch06s02s04.html | 211 + .../EDBG/protocoldocs/ch06s02s05.html | 211 + .../atmel-docs/EDBG/protocoldocs/ch06s03.html | 211 + .../EDBG/protocoldocs/ch06s03s01.html | 213 + .../EDBG/protocoldocs/ch06s03s02.html | 211 + .../EDBG/protocoldocs/ch06s04s01.html | 213 + .../EDBG/protocoldocs/ch06s04s02.html | 219 + .../EDBG/protocoldocs/ch06s04s03.html | 211 + .../atmel-docs/EDBG/protocoldocs/ch06s05.html | 211 + .../EDBG/protocoldocs/ch06s05s01.html | 227 + .../EDBG/protocoldocs/ch06s05s02.html | 231 + .../EDBG/protocoldocs/ch06s05s03.html | 219 + .../EDBG/protocoldocs/ch06s05s04.html | 220 + .../EDBG/protocoldocs/ch06s05s05.html | 231 + .../atmel-docs/EDBG/protocoldocs/ch06s06.html | 423 + .../atmel-docs/EDBG/protocoldocs/ch07s01.html | 211 + .../EDBG/protocoldocs/ch07s01s01.html | 211 + .../EDBG/protocoldocs/ch07s01s02.html | 211 + .../EDBG/protocoldocs/ch07s01s03.html | 211 + .../EDBG/protocoldocs/ch07s01s04.html | 211 + .../EDBG/protocoldocs/ch07s01s05.html | 211 + .../EDBG/protocoldocs/ch07s01s06.html | 212 + .../EDBG/protocoldocs/ch07s01s07.html | 231 + .../EDBG/protocoldocs/ch07s01s08.html | 211 + .../EDBG/protocoldocs/ch07s01s09.html | 211 + .../EDBG/protocoldocs/ch07s01s10.html | 211 + .../EDBG/protocoldocs/ch07s01s11.html | 211 + .../EDBG/protocoldocs/ch07s01s12.html | 212 + .../EDBG/protocoldocs/ch07s01s13.html | 211 + .../EDBG/protocoldocs/ch07s01s14.html | 211 + .../EDBG/protocoldocs/ch07s01s15.html | 211 + .../EDBG/protocoldocs/ch07s01s16.html | 211 + .../EDBG/protocoldocs/ch07s01s17.html | 211 + .../atmel-docs/EDBG/protocoldocs/ch07s02.html | 211 + .../atmel-docs/EDBG/protocoldocs/ch07s03.html | 253 + .../atmel-docs/EDBG/protocoldocs/ch08s01.html | 211 + .../EDBG/protocoldocs/ch08s01s01.html | 211 + .../EDBG/protocoldocs/ch08s01s02.html | 211 + .../EDBG/protocoldocs/ch08s01s03.html | 211 + .../EDBG/protocoldocs/ch08s01s04.html | 211 + .../EDBG/protocoldocs/ch08s01s05.html | 211 + .../EDBG/protocoldocs/ch08s01s06.html | 211 + .../atmel-docs/EDBG/protocoldocs/ch08s02.html | 211 + .../atmel-docs/EDBG/protocoldocs/ch08s03.html | 240 + .../EDBG/protocoldocs/document.revisions.html | 209 + .../atmel-docs/EDBG/protocoldocs/index.html | 227 + .../atmel-docs/EDBG/protocoldocs/pr01.html | 213 + .../protocoldocs.Introduction.html | 209 + .../protocoldocs.avr32protocol.html | 212 + .../protocoldocs.avr8protocol.html | 211 + .../protocoldocs.avrispprotocol.html | 219 + .../protocoldocs.avrprotocol.Overview.html | 209 + .../protocoldocs/protocoldocs.cmsis_dap.html | 209 + .../protocoldocs.edbg_ctrl_protocol.html | 210 + .../protocoldocs.tpiprotocol.html | 213 + .../protocoldocs/search/htmlFileInfoList.js | 392 + .../EDBG/protocoldocs/search/index-1.js | 851 + .../EDBG/protocoldocs/search/index-2.js | 850 + .../EDBG/protocoldocs/search/index-3.js | 846 + .../EDBG/protocoldocs/search/l10n.js | 3 + .../EDBG/protocoldocs/search/nwSearchFnt.js | 886 + .../search/stemmers/en_stemmer.js | 234 + .../protocoldocs/section_avr32_memtypes.html | 211 + .../section_avr32_setget_params.html | 217 + .../protocoldocs/section_avr8_memtypes.html | 211 + .../section_avr8_query_contexts.html | 211 + .../section_avr8_setget_params.html | 231 + .../section_edbg_ctrl_setget_params.html | 368 + .../section_edbg_query_contexts.html | 211 + .../section_housekeeping_start_session.html | 214 + .../EDBG/protocoldocs/section_i5v_3yz_rl.html | 211 + .../EDBG/protocoldocs/section_jdx_m11_sl.html | 211 + .../EDBG/protocoldocs/section_qhb_x1c_sl.html | 211 + .../protocoldocs/section_serial_trace.html | 214 + .../EDBG/protocoldocs/section_t1f_hb1_sl.html | 211 + xs/src/avrdude/atmel-docs/JTAGICE-AVR060.pdf | Bin 0 -> 139206 bytes .../avrdude/atmel-docs/JTAGICEmkII-AVR067.pdf | Bin 0 -> 327125 bytes xs/src/avrdude/atmel-docs/STK500-AVR061.pdf | Bin 0 -> 814798 bytes xs/src/avrdude/atmel-docs/STK500v2-AVR068.pdf | Bin 0 -> 161607 bytes xs/src/avrdude/avr.c | 1243 ++ xs/src/avrdude/avr910.c | 774 + xs/src/avrdude/avr910.h | 35 + xs/src/avrdude/avrdude.1 | 1133 ++ xs/src/avrdude/avrdude.conf | 14982 +++++++++++++++ xs/src/avrdude/avrdude.conf.in | 14984 ++++++++++++++++ xs/src/avrdude/avrdude.conf.tmp | 14984 ++++++++++++++++ xs/src/avrdude/avrdude.h | 63 + xs/src/avrdude/avrdude.spec.in | 113 + xs/src/avrdude/avrftdi.c | 1275 ++ xs/src/avrdude/avrftdi.h | 40 + xs/src/avrdude/avrftdi_private.h | 86 + xs/src/avrdude/avrftdi_tpi.c | 254 + xs/src/avrdude/avrftdi_tpi.h | 9 + xs/src/avrdude/avrpart.c | 680 + xs/src/avrdude/bitbang.c | 655 + xs/src/avrdude/bitbang.h | 58 + xs/src/avrdude/bootstrap | 21 + xs/src/avrdude/buspirate.c | 1374 ++ xs/src/avrdude/buspirate.h | 32 + xs/src/avrdude/butterfly.c | 762 + xs/src/avrdude/butterfly.h | 37 + xs/src/avrdude/config.c | 349 + xs/src/avrdude/config.h | 103 + xs/src/avrdude/config_gram.c | 3718 ++++ xs/src/avrdude/config_gram.h | 330 + xs/src/avrdude/config_gram.y | 1571 ++ xs/src/avrdude/configure.ac | 572 + xs/src/avrdude/confwin.c | 54 + xs/src/avrdude/crc16.c | 83 + xs/src/avrdude/crc16.h | 34 + xs/src/avrdude/dfu.c | 516 + xs/src/avrdude/dfu.h | 137 + xs/src/avrdude/doc/.cvsignore | 25 + xs/src/avrdude/doc/Makefile.am | 94 + xs/src/avrdude/doc/TODO | 26 + xs/src/avrdude/doc/avrdude.texi | 2586 +++ xs/src/avrdude/doc/parts_comments.txt | 5 + xs/src/avrdude/fileio.c | 1604 ++ xs/src/avrdude/flip1.c | 949 + xs/src/avrdude/flip1.h | 35 + xs/src/avrdude/flip2.c | 1002 ++ xs/src/avrdude/flip2.h | 35 + xs/src/avrdude/freebsd_ppi.h | 39 + xs/src/avrdude/ft245r.c | 963 + xs/src/avrdude/ft245r.h | 8 + xs/src/avrdude/jtag3.c | 2286 +++ xs/src/avrdude/jtag3.h | 60 + xs/src/avrdude/jtag3_private.h | 319 + xs/src/avrdude/jtagmkI.c | 1365 ++ xs/src/avrdude/jtagmkI.h | 36 + xs/src/avrdude/jtagmkII.c | 4023 +++++ xs/src/avrdude/jtagmkII.h | 63 + xs/src/avrdude/jtagmkII_private.h | 385 + xs/src/avrdude/jtagmkI_private.h | 168 + xs/src/avrdude/lexer.c | 3066 ++++ xs/src/avrdude/lexer.l | 262 + xs/src/avrdude/libavrdude.h | 945 + xs/src/avrdude/linux_ppdev.h | 57 + xs/src/avrdude/linuxgpio.c | 354 + xs/src/avrdude/linuxgpio.h | 36 + xs/src/avrdude/lists.c | 1407 ++ xs/src/avrdude/main.c | 1412 ++ xs/src/avrdude/my_ddk_hidsdi.h | 48 + xs/src/avrdude/par.c | 411 + xs/src/avrdude/par.h | 35 + xs/src/avrdude/pgm.c | 332 + xs/src/avrdude/pgm_type.c | 153 + xs/src/avrdude/pickit2.c | 1340 ++ xs/src/avrdude/pickit2.h | 35 + xs/src/avrdude/pindefs.c | 370 + xs/src/avrdude/ppi.c | 236 + xs/src/avrdude/ppi.h | 59 + xs/src/avrdude/ppiwin.c | 417 + xs/src/avrdude/safemode.c | 318 + xs/src/avrdude/ser_avrdoper.c | 661 + xs/src/avrdude/ser_posix.c | 497 + xs/src/avrdude/ser_win32.c | 698 + xs/src/avrdude/serbb.h | 37 + xs/src/avrdude/serbb_posix.c | 321 + xs/src/avrdude/serbb_win32.c | 366 + xs/src/avrdude/solaris_ecpp.h | 50 + xs/src/avrdude/stk500.c | 1320 ++ xs/src/avrdude/stk500.h | 41 + xs/src/avrdude/stk500_private.h | 103 + xs/src/avrdude/stk500generic.c | 90 + xs/src/avrdude/stk500generic.h | 29 + xs/src/avrdude/stk500v2.c | 4762 +++++ xs/src/avrdude/stk500v2.h | 65 + xs/src/avrdude/stk500v2_private.h | 331 + xs/src/avrdude/term.c | 957 + xs/src/avrdude/term.h | 37 + xs/src/avrdude/tools/build-mingw32.sh | 54 + xs/src/avrdude/tools/get-dw-params.xsl | 155 + xs/src/avrdude/tools/get-hv-params.xsl | 254 + xs/src/avrdude/tools/get-stk600-cards.xsl | 62 + xs/src/avrdude/tools/get-stk600-devices.xsl | 51 + xs/src/avrdude/tpi.h | 76 + xs/src/avrdude/update.c | 388 + xs/src/avrdude/usb_hidapi.c | 357 + xs/src/avrdude/usb_libusb.c | 615 + xs/src/avrdude/usbasp.c | 1221 ++ xs/src/avrdude/usbasp.h | 137 + xs/src/avrdude/usbdevs.h | 83 + xs/src/avrdude/usbtiny.c | 589 + xs/src/avrdude/usbtiny.h | 68 + xs/src/avrdude/windows/.cvsignore | 4 + xs/src/avrdude/windows/Makefile.am | 57 + xs/src/avrdude/windows/giveio.c | 168 + xs/src/avrdude/windows/giveio.sys | Bin 0 -> 5248 bytes xs/src/avrdude/windows/install_giveio.bat | 34 + xs/src/avrdude/windows/loaddrv.c | 460 + xs/src/avrdude/windows/loaddrv.h | 20 + xs/src/avrdude/windows/remove_giveio.bat | 14 + xs/src/avrdude/windows/status_giveio.bat | 12 + xs/src/avrdude/wiring.c | 221 + xs/src/avrdude/wiring.h | 29 + 415 files changed, 167903 insertions(+) create mode 100644 xs/src/avrdude/AUTHORS create mode 100644 xs/src/avrdude/BUILD-FROM-SVN create mode 100644 xs/src/avrdude/COPYING create mode 100644 xs/src/avrdude/ChangeLog create mode 100644 xs/src/avrdude/ChangeLog-2001 create mode 100644 xs/src/avrdude/ChangeLog-2002 create mode 100644 xs/src/avrdude/ChangeLog-2003 create mode 100644 xs/src/avrdude/ChangeLog-2004-2006 create mode 100644 xs/src/avrdude/ChangeLog-2007 create mode 100644 xs/src/avrdude/ChangeLog-2008 create mode 100644 xs/src/avrdude/ChangeLog-2009 create mode 100644 xs/src/avrdude/ChangeLog-2010 create mode 100644 xs/src/avrdude/ChangeLog-2011 create mode 100644 xs/src/avrdude/ChangeLog-2012 create mode 100644 xs/src/avrdude/ChangeLog-2013 create mode 100644 xs/src/avrdude/ChangeLog-2014 create mode 100644 xs/src/avrdude/ChangeLog-2015 create mode 100644 xs/src/avrdude/Makefile.am create mode 100644 xs/src/avrdude/NEWS create mode 100644 xs/src/avrdude/README create mode 100644 xs/src/avrdude/ac_cfg.h create mode 100644 xs/src/avrdude/ac_cfg.h.in create mode 100644 xs/src/avrdude/arduino.c create mode 100644 xs/src/avrdude/arduino.h create mode 100644 xs/src/avrdude/atmel-docs/AVR109.pdf create mode 100644 xs/src/avrdude/atmel-docs/AVR910.pdf create mode 100644 xs/src/avrdude/atmel-docs/AVRISPmkII-AVR069.pdf create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/browserDetect.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/css/960.css create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/css/docbook.css create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/css/fluid_grid.css create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/css/index.css create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/css/positioning.css create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/css/print.css create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/css/reset.css create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/css/text.css create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/fonts/DroidSansMono.eot create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/fonts/DroidSansMono.ttf create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/Book_Closed.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/Book_Open.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/Document_Text.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/Library.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/external_link.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/loading.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/logo.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/minus.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/next-arrow.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/plus.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/previous-arrow.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/search-icon.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/sidebar.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/starsSmall.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/toc-icon.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/images/ui-icons_217bc0_256x240.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/jquery-1.7.2.min.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/jquery.cookie.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/jquery.ui.all.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/layout/jquery.layout.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-anim_basic_16x16.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_flat_55_fbec88_40x100.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_glass_75_d0e5f5_1x400.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_glass_85_dfeffc_1x400.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_217bc0_256x240.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_2e83ff_256x240.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_469bdd_256x240.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_6da8d5_256x240.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_cd0a0a_256x240.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_d8e7f3_256x240.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_f9bd01_256x240.png create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/file.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/folder-closed.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/folder.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-black-line.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-black.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-default-line.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-default.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-famfamfam-line.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-famfamfam.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-gray-line.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-gray.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-red-line.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-red.gif create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/jquery.treeview.css create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/jquery.treeview.min.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/main.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/common/splitterInit.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch01s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch01s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s02s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s02s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s02s02s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s02s02s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s02s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s02s03s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s02s03s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s02s03s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s02s03s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s03s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s03s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s03s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s03s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s03s05.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s03s06.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s03s07.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s03s08.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s03s09.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s04s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s04s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch02s04s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch03s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch03s01s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch03s01s01.html~ create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch03s01s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch03s01s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch03s01s03s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch03s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch03s02s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch03s02s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch03s02s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch03s02s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s04s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s04s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s04s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s04s05.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s06.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s06s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s06s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s06s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s06s05.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s07.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s07s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s07s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s07s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s07s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s08.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s08s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s08s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s08s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s09.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch04s05s10.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s05.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s06.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s07.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s08.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s09.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s10.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s11.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s12.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s13.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s14.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s01s15.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s02s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s02s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s02s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s02s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s02s05.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s02s06.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s03s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s03s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s03s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch05s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s05.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s06.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s07.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s08.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s09.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s10.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s11.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s12.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s13.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s14.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s15.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s16.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s17.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s18.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s19.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s20.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s21.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s22.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s23.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s24.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s25.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s26.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s27.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s28.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s01s29.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s02s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s02s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s02s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s02s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s02s05.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s03s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s03s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s04s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s04s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s04s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s05.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s05s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s05s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s05s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s05s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s05s05.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch06s06.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s05.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s06.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s07.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s08.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s09.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s10.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s11.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s12.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s13.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s14.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s15.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s16.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s01s17.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch07s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch08s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch08s01s01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch08s01s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch08s01s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch08s01s04.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch08s01s05.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch08s01s06.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch08s02.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/ch08s03.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/document.revisions.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/index.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/pr01.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/protocoldocs.Introduction.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/protocoldocs.avr32protocol.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/protocoldocs.avr8protocol.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/protocoldocs.avrispprotocol.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/protocoldocs.avrprotocol.Overview.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/protocoldocs.cmsis_dap.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/protocoldocs.edbg_ctrl_protocol.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/protocoldocs.tpiprotocol.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/search/htmlFileInfoList.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/search/index-1.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/search/index-2.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/search/index-3.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/search/l10n.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/search/nwSearchFnt.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/search/stemmers/en_stemmer.js create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/section_avr32_memtypes.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/section_avr32_setget_params.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/section_avr8_memtypes.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/section_avr8_query_contexts.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/section_avr8_setget_params.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/section_edbg_ctrl_setget_params.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/section_edbg_query_contexts.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/section_housekeeping_start_session.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/section_i5v_3yz_rl.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/section_jdx_m11_sl.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/section_qhb_x1c_sl.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/section_serial_trace.html create mode 100644 xs/src/avrdude/atmel-docs/EDBG/protocoldocs/section_t1f_hb1_sl.html create mode 100644 xs/src/avrdude/atmel-docs/JTAGICE-AVR060.pdf create mode 100644 xs/src/avrdude/atmel-docs/JTAGICEmkII-AVR067.pdf create mode 100644 xs/src/avrdude/atmel-docs/STK500-AVR061.pdf create mode 100644 xs/src/avrdude/atmel-docs/STK500v2-AVR068.pdf create mode 100644 xs/src/avrdude/avr.c create mode 100644 xs/src/avrdude/avr910.c create mode 100644 xs/src/avrdude/avr910.h create mode 100644 xs/src/avrdude/avrdude.1 create mode 100644 xs/src/avrdude/avrdude.conf create mode 100644 xs/src/avrdude/avrdude.conf.in create mode 100644 xs/src/avrdude/avrdude.conf.tmp create mode 100644 xs/src/avrdude/avrdude.h create mode 100644 xs/src/avrdude/avrdude.spec.in create mode 100644 xs/src/avrdude/avrftdi.c create mode 100644 xs/src/avrdude/avrftdi.h create mode 100644 xs/src/avrdude/avrftdi_private.h create mode 100644 xs/src/avrdude/avrftdi_tpi.c create mode 100644 xs/src/avrdude/avrftdi_tpi.h create mode 100644 xs/src/avrdude/avrpart.c create mode 100644 xs/src/avrdude/bitbang.c create mode 100644 xs/src/avrdude/bitbang.h create mode 100755 xs/src/avrdude/bootstrap create mode 100644 xs/src/avrdude/buspirate.c create mode 100644 xs/src/avrdude/buspirate.h create mode 100644 xs/src/avrdude/butterfly.c create mode 100644 xs/src/avrdude/butterfly.h create mode 100644 xs/src/avrdude/config.c create mode 100644 xs/src/avrdude/config.h create mode 100644 xs/src/avrdude/config_gram.c create mode 100644 xs/src/avrdude/config_gram.h create mode 100644 xs/src/avrdude/config_gram.y create mode 100644 xs/src/avrdude/configure.ac create mode 100644 xs/src/avrdude/confwin.c create mode 100644 xs/src/avrdude/crc16.c create mode 100644 xs/src/avrdude/crc16.h create mode 100644 xs/src/avrdude/dfu.c create mode 100644 xs/src/avrdude/dfu.h create mode 100644 xs/src/avrdude/doc/.cvsignore create mode 100644 xs/src/avrdude/doc/Makefile.am create mode 100644 xs/src/avrdude/doc/TODO create mode 100644 xs/src/avrdude/doc/avrdude.texi create mode 100644 xs/src/avrdude/doc/parts_comments.txt create mode 100644 xs/src/avrdude/fileio.c create mode 100644 xs/src/avrdude/flip1.c create mode 100644 xs/src/avrdude/flip1.h create mode 100644 xs/src/avrdude/flip2.c create mode 100644 xs/src/avrdude/flip2.h create mode 100644 xs/src/avrdude/freebsd_ppi.h create mode 100644 xs/src/avrdude/ft245r.c create mode 100644 xs/src/avrdude/ft245r.h create mode 100644 xs/src/avrdude/jtag3.c create mode 100644 xs/src/avrdude/jtag3.h create mode 100644 xs/src/avrdude/jtag3_private.h create mode 100644 xs/src/avrdude/jtagmkI.c create mode 100644 xs/src/avrdude/jtagmkI.h create mode 100644 xs/src/avrdude/jtagmkII.c create mode 100644 xs/src/avrdude/jtagmkII.h create mode 100644 xs/src/avrdude/jtagmkII_private.h create mode 100644 xs/src/avrdude/jtagmkI_private.h create mode 100644 xs/src/avrdude/lexer.c create mode 100644 xs/src/avrdude/lexer.l create mode 100644 xs/src/avrdude/libavrdude.h create mode 100644 xs/src/avrdude/linux_ppdev.h create mode 100644 xs/src/avrdude/linuxgpio.c create mode 100644 xs/src/avrdude/linuxgpio.h create mode 100644 xs/src/avrdude/lists.c create mode 100644 xs/src/avrdude/main.c create mode 100644 xs/src/avrdude/my_ddk_hidsdi.h create mode 100644 xs/src/avrdude/par.c create mode 100644 xs/src/avrdude/par.h create mode 100644 xs/src/avrdude/pgm.c create mode 100644 xs/src/avrdude/pgm_type.c create mode 100644 xs/src/avrdude/pickit2.c create mode 100644 xs/src/avrdude/pickit2.h create mode 100644 xs/src/avrdude/pindefs.c create mode 100644 xs/src/avrdude/ppi.c create mode 100644 xs/src/avrdude/ppi.h create mode 100644 xs/src/avrdude/ppiwin.c create mode 100644 xs/src/avrdude/safemode.c create mode 100644 xs/src/avrdude/ser_avrdoper.c create mode 100644 xs/src/avrdude/ser_posix.c create mode 100644 xs/src/avrdude/ser_win32.c create mode 100644 xs/src/avrdude/serbb.h create mode 100644 xs/src/avrdude/serbb_posix.c create mode 100644 xs/src/avrdude/serbb_win32.c create mode 100644 xs/src/avrdude/solaris_ecpp.h create mode 100644 xs/src/avrdude/stk500.c create mode 100644 xs/src/avrdude/stk500.h create mode 100644 xs/src/avrdude/stk500_private.h create mode 100644 xs/src/avrdude/stk500generic.c create mode 100644 xs/src/avrdude/stk500generic.h create mode 100644 xs/src/avrdude/stk500v2.c create mode 100644 xs/src/avrdude/stk500v2.h create mode 100644 xs/src/avrdude/stk500v2_private.h create mode 100644 xs/src/avrdude/term.c create mode 100644 xs/src/avrdude/term.h create mode 100755 xs/src/avrdude/tools/build-mingw32.sh create mode 100644 xs/src/avrdude/tools/get-dw-params.xsl create mode 100644 xs/src/avrdude/tools/get-hv-params.xsl create mode 100644 xs/src/avrdude/tools/get-stk600-cards.xsl create mode 100644 xs/src/avrdude/tools/get-stk600-devices.xsl create mode 100644 xs/src/avrdude/tpi.h create mode 100644 xs/src/avrdude/update.c create mode 100644 xs/src/avrdude/usb_hidapi.c create mode 100644 xs/src/avrdude/usb_libusb.c create mode 100644 xs/src/avrdude/usbasp.c create mode 100644 xs/src/avrdude/usbasp.h create mode 100644 xs/src/avrdude/usbdevs.h create mode 100644 xs/src/avrdude/usbtiny.c create mode 100644 xs/src/avrdude/usbtiny.h create mode 100644 xs/src/avrdude/windows/.cvsignore create mode 100644 xs/src/avrdude/windows/Makefile.am create mode 100644 xs/src/avrdude/windows/giveio.c create mode 100644 xs/src/avrdude/windows/giveio.sys create mode 100755 xs/src/avrdude/windows/install_giveio.bat create mode 100644 xs/src/avrdude/windows/loaddrv.c create mode 100644 xs/src/avrdude/windows/loaddrv.h create mode 100755 xs/src/avrdude/windows/remove_giveio.bat create mode 100755 xs/src/avrdude/windows/status_giveio.bat create mode 100644 xs/src/avrdude/wiring.c create mode 100644 xs/src/avrdude/wiring.h diff --git a/xs/src/avrdude/AUTHORS b/xs/src/avrdude/AUTHORS new file mode 100644 index 000000000..6abbec066 --- /dev/null +++ b/xs/src/avrdude/AUTHORS @@ -0,0 +1,28 @@ +AVRDUDE was written by: + + Brian S. Dean + +Contributors: + + Joerg Wunsch + Eric Weddington + Jan-Hinnerk Reichert + Alex Shepherd + Martin Thomas + Theodore A. Roth + Michael Holzt + Colin O'Flynn + Thomas Fischl + David Hoerl + Michal Ludvig + Darell Tan + Wolfgang Moser + Ville Voipio + Hannes Weisbach + Doug Springer + Brett Hagman + Rene Liebscher + Jim Paris + +For minor contributions, please see the ChangeLog files. + diff --git a/xs/src/avrdude/BUILD-FROM-SVN b/xs/src/avrdude/BUILD-FROM-SVN new file mode 100644 index 000000000..3a218f2d1 --- /dev/null +++ b/xs/src/avrdude/BUILD-FROM-SVN @@ -0,0 +1,13 @@ +$Id$ + +How to build avrdude from SVN: + +1. svn co svn://svn.savannah.nongnu.org/avrdude/trunk + +2. cd trunk/avrdude + +3. ./bootstrap + +4. ./configure + +5. make diff --git a/xs/src/avrdude/COPYING b/xs/src/avrdude/COPYING new file mode 100644 index 000000000..e69cf7e6c --- /dev/null +++ b/xs/src/avrdude/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/xs/src/avrdude/ChangeLog b/xs/src/avrdude/ChangeLog new file mode 100644 index 000000000..975f52317 --- /dev/null +++ b/xs/src/avrdude/ChangeLog @@ -0,0 +1,90 @@ +2016-05-10 Joerg Wunsch + + Submitted by Hannes Jochriem: + * avrdude.conf.in (ehajo-isp): New programmer. + +2016-04-20 Joerg Wunsch + + * configure.ac (libftdi1): Rather than hardcoding the library + providing the libusb-1.0 API, use the result from the previous + probe. This helps detecting libftdi1 on FreeBSD where the + libusb-1.0 API is provided by the system's libusb. + +2016-04-18 Joerg Wunsch + + * usb_hidapi.c (usbhid_open): Correctly calculate the + offset for serial number matching + +2016-03-28 Joerg Wunsch + + bug #47550: Linux GPIO broken + * linuxgpio.c: Replace %ud by %u in snprintf calls. + +2016-03-02 Joerg Wunsch + + * usb_hidapi.c (usbhid_recv): Bump read timeout to 300 ms. + +2016-02-20 Joerg Wunsch + + * jtag3.c: add support for libhidapi as (optional) transport for + CMSIS-DAP compliant debuggers (JTAGICE3 with firmware 3+, + AtmelICE, EDBG, mEDBG) + * usb_hidapi.c: (New file) + * libavrdude.h: Mention usbhid_serdev + * configure.ac: Bump version date + +2016-02-18 Joerg Wunsch + + (Obtained from patch #8717: pattch for mcprog and libhidapi support) + * configure.ac: Probe for libhidapi + * Makefile.am: Add @LIBHIDAPI@ + +2016-02-16 Joerg Wunsch + + * doc/avrdude.texi: Bump copyright year. + +2016-02-16 Joerg Wunsch + + * configure.ac: Bump for post-release 6.3. + +2016-02-16 Joerg Wunsch + + * configure.ac: Released version 6.3. + +2016-02-15 Joerg Wunsch + + patch #8894: Spelling in 6.2 doc + * doc/avrdude.texi: Various spelling fixes. + +2016-02-15 Joerg Wunsch + + patch #8895: Spelling in 6.2 code + * avrftdi.c (avrftdi_open): Spell fix. + +2016-02-15 Joerg Wunsch + + patch #8896: Silence cppcheck warnings in 6.2 code + * linuxgpio.c: Use %ud to print GPIO values. + +2016-02-15 Joerg Wunsch + + patch #8735: ATtiny28 support in avrdude.conf + * avrdude.conf.in (ATtiny28): New device. + +2016-02-15 Joerg Wunsch + + * avrdude.conf.in (ATmega48PB, ATmega88PB, ATmega168PB): New + devices. + +2016-02-15 Joerg Wunsch + + patch #8435: Implementing mEDBG CMSIS-DAP protocol + * usb_libusb.c: Add endpoint IDs for Xplained Mini, correctly + transfer trailing ZLP when needed + * avrdude.conf.in (xplainedmini, xplainedmini_dw): New entries. + * jtag3.c (jtag3_edbg_send, jtag3_edbg_recv_frame): Implement + fragmentation needed for the 64-byte EP size of the Xplained Mini + * avrdude.1: Document the change + * doc/avrdude.texi: (Dito.) + + diff --git a/xs/src/avrdude/ChangeLog-2001 b/xs/src/avrdude/ChangeLog-2001 new file mode 100644 index 000000000..048dcf1c2 --- /dev/null +++ b/xs/src/avrdude/ChangeLog-2001 @@ -0,0 +1,598 @@ +2001-12-30 Brian S. Dean + + * main.c: Update version. + + * avrdude.conf.sample: Clarify a comment. + + * avrdude.conf.sample: fix address bits + + * avrdude.1: Bring up to date. + +2001-12-29 Brian S. Dean + + * avrdude.conf.sample: Add the AVR3 progammer. + + * avr.c, avrdude.conf.sample, config_gram.y, main.c, pindefs.h: + Fix VCC assertion. + + Make the BUFF pin a mask like VCC to allow multiple pins to be + asserted at the same time (STK200 has two buffer enable lines). + + Add the STK200 programmer. + + Fix EEPROM address line selection for several parts. + +2001-12-15 Brian S. Dean + + * avrdude.conf.sample: fix spelling error + +2001-11-24 Brian S. Dean + + * Makefile: + Change "WARNING" to "NOTE" when overwriting the avrprog.conf file. + + * avrdude.1: Add my e-mail address. + + * avrdude.conf.sample: + Add comments about instruction formats. Correct an instruction + specification (cut&paste error). + +2001-11-21 Brian S. Dean + + * avr.c, config_gram.y, lexer.l, term.c: + In interactive mode, reset the address and length if we start dumping + a memory type different than the previous one. + + * avr.c, avrdude.conf.sample, config_gram.y: + Allow instruction data to be specified more flexibly, which can be + used to make the instruction input more readable in the config file. + + * main.c: Bump version number. + + * Makefile, avr.c, avr.h, avrdude.conf.sample, config.c, config.h: + * config_gram.y, fileio.c, fileio.h, lexer.l, main.c, term.c: + This is a major re-write of the programming algorithms. The Atmel + serial programming instructions are not very orthoganal, i.e., the + "read fuse bits" instruction on an ATMega103 is an entirely different + opcode and data format from the _same_ instruction for an ATMega163! + Thus, it becomes impossible to have a single instruction encoding + (varying the data) across the chip lines. + + This set of changes allows and requires instruction encodings to be + defined on a per-part basis within the configuration file. Hopefully + I've defined the encoding scheme in a general enough way so it is + useful in describing the instruction formats for yet-to-be invented + Atmel chips. I've tried hard to make it match very closely with the + specification in Atmel's data sheets for their parts. It's a little + more verbose than what I initially hoped for, but I've tried to keep + it as concise as I could, while still remaining reasonably flexible. + +2001-11-19 Brian S. Dean + + * avr.c, avr.h, avrdude.conf.sample, main.c, ppi.c, term.c: + Add support for ATMega163. + + Add support for reading/writing ATMega163 lock and fuse bits. + Unfortunately, in looking at the specs for other ATMega parts, they + use entirely different instruction formats for these commands. Thus, + these routines won't work for the ATMega103, for example. + + Add support for sending raw command bytes via the interactive terminal + interface. This allows one to execute any programming instruction on + the target device, whether or not avrprog supports it explicitly or + not. Thus, one can use this feature to program fuse / lock bits, or + access any other feature of a current or future device that avrprog + does not know how to do. + + Add in comments, an experimental instruction format in the + configuration file. If this works out, it would allow supporting new + parts and non-orthoganal instructions across existing parts without + making avrprog code changes. + +2001-11-17 Brian S. Dean + + * avrdude.conf.sample: Add ATMEGA163 part. + +2001-11-11 Brian S. Dean + + * main.c: output formatting + +2001-11-05 Brian S. Dean + + * ppi.c: Get ppi.h from /usr/include, not /sys. + +2001-10-31 Brian S. Dean + + * avr.c, avrdude.conf.sample, main.c: Correct version string. + Update read/write status more frequently. + Prefix ATMega parts with an 'm'. + +2001-10-16 Brian S. Dean + + * avr.c: Change ording for memory display. + + * config_gram.y: comment + + * avr.c, avr.h, avrdude.conf.sample, config_gram.y, lexer.l, term.c: + Fix (again, hopefully) page addressing for the ATMega parts. + + Rename the poorly chosen name "bank" to "page" for page addressing. + Atmel calls it "page" in their documentation. + + * config_gram.y, main.c: Fix an (non)exit. + Silence a couple of compiler warnings. + + * avr.c, avr.h, avrdude.conf.sample, config_gram.y, main.c: + Fix ATMega flash addressing. Add an ATMEGA16 part. Perform sanity + checking on the memory parameters for parts that do bank addressing. + +2001-10-15 Brian S. Dean + + * config.c, config.h, lists.h: Add copyright. + + * config_gram.y, lexer.l, lists.c: Add copyrights. + + * Makefile: Attempt to install avrprog.conf. + + * avrdude.conf.sample: Correct dt006 pinout. + + * Makefile, lexer.l: + Try and detect an old-style config file and print an appropriate error + message and a suggestion for correcting it. + + * Makefile, avr.c, avrdude.1, avrdude.conf.sample: Update the man page. + + Miscellaneous minor cleanups. + +2001-10-14 Brian S. Dean + + * Makefile, Makefile.inc, avr.c, avr.h, avrdude.conf.sample: + * config.c, config.h, config_gram.y, lexer.l, lists.c, lists.h: + * main.c, pindefs.h, term.c: + Use lex/yacc for parsing the config file. Re-work the config file + format using a more human-readable format. + + Read part descriptions from the config file now instead of hard-coding + them. + + Update usage(). + + Cleanup unused code. + + * Makefile, avr.c, avr.h, fileio.c, term.c: + First cut at supporting the ATmega 103 which uses bank addressing and + has a 128K flash. + + Due to the bank addressing required, interactive update of the flash + is not supported, though the eeprom can be updated interactively. + Both memories can be programmed via non-interactive mode. + + Intel Hex Record type '04' is now generated as required for outputing + memory contents that go beyond 64K. + +2001-10-13 Brian S. Dean + + * avr.c, avr.h, fileio.c, fileio.h, main.c, ppi.c, ppi.h, term.c: + * term.h: + Style fixes. + + * avr.c, avr.h, fileio.c, fileio.h, main.c, term.c: + Commit changes in preparation for support the ATMega line. + +2001-10-01 Brian S. Dean + + * Makefile: Don't override CFLAGS. + + * avrdude.1: Correct default pin assignment. + + * avr.c, fileio.c, main.c, ppi.c, term.c: + Remove debugging code - it served its purpose. + + Update copyrights. + +2001-09-21 Brian S. Dean + + * main.c: + Be sure to read the exit specs after the pin configuration has been + assigned, otherwise, we may apply the exit specs to the wrong pins. + + * main.c: debugging + +2001-09-20 Brian S. Dean + + * avrdude.1, avrdude.conf.sample, main.c: + Prefix pin config entries in the config file with a "c:". Later, I + might make part descriptions read in this way and we can use a + different letter for those (p). This will make the parsing easier to + distinguish between the entry types. + + * main.c: Initialize pin configuration description. + +2001-09-19 Brian S. Dean + + * AVRprog.pdf, Makefile, avr.c, avrdude.1, avrdude.conf.sample: + * avrdude.pdf, fileio.c, fileio.h, main.c, pindefs.h, term.c: + Make the pin definitions configurable based on entries in a config + file. This makes supporting other programmers much easier. + + Rename AVRprog.pdf to avrprog.pdf. + +2001-04-29 Brian S. Dean + + * avrprog-programmer.jpg: Remove this image file from the repository. + +2001-04-26 Brian S. Dean + + * avrprog-schematic.jpg: + Remove this image, use AVRprog.pdf as the preferred schematic for the + programmer. + +2001-04-25 Brian S. Dean + + * AVRprog.pdf, Makefile, avrdude.1: + Add a schematic provided by Joerg Wunch and also update the manual + page (also updated by Joerg) to reference the schematic. + +2001-02-25 Brian S. Dean + + * Makefile, Makefile.inc: Automate dependency generation. + +2001-02-08 Brian S. Dean + + * main.c: Turn off ready led when finished programming. + + * main.c: update version + + * avr.c, main.c: Correct a few comments. + + * Makefile, avr.c, term.c: Makefile : update dependencies + + avr.c : correct status led updates + + term.c : update status leds on write, make the address and length + arguments for dump optional. + +2001-01-26 Brian S. Dean + + * main.c: Version 1.1 + + * main.c: + Hmmm ... cvs co -D does not work. Change the revision + timestamp to a full date/time value. + + * avr.c, fileio.c, main.c, ppi.c, term.c: + Add a -V option to display the version information about each + component module. This is intended for support purposes, so that I + can tell unambiguously what version a binary out in the field is. + + Additionally, display a revision timestamp along with the version + number. This also is intended for aiding in support and is the Unix + time of the latest component module. Having this, should allow me to + do a "cvs co -D timestamp avrprog" and get exactly the source of the + version that is being reported. + + * fileio.c: + Return the maximum address (+1) written as opposed to the actual + number of bytes written. The presence of an Intel Hex address + record can cause these two number to be different; but the callers + of this routine need the former. + + * main.c: + Fix a place where we were exiting without applying the exit-specs. + + Wrap a long line. + + * avr.c, fileio.c: avr.c: Update a comment. + + fileio.c: Properly handle all the Intel Hex record types that I can + find information about. + +2001-01-25 Brian S. Dean + + * Usage, avr.h: Get rid of the Usage file. + +2001-01-24 Brian S. Dean + + * Makefile, avr.c, avr.h, main.c, pindefs.h, ppi.c: + Move pin definitions to their own file. + + First pass at providing feedback via the optionally connected leds. I + don't actually have any of these attached to my programmer, so I can + only guess as whether this is toggling them on and off correctly. + + Also, enable and disable the optional 74367 buffer. + + * avr.h, main.c, ppi.c, ppi.h, avr.c: + Rearrange the pinout for the programmer to be a little more logical. + Provide hooks to support a buffered programmer, pin 6 is now used to + enable a buffer that can be used to isolate the target system from the + parallel port pins. This is important when programming the target + in-system. + + Totally change the way the pin definitions are defined. Actually + set/clear pins based on the way more intuitive pin number, instead of + PPI data register, bit number combination. A table of pin data is + used so that any hardware inversion done by the parallel port is + accounted for, what you set is actually what appears at the pin. + Retain the old method for handling Vcc, however, because the hold + method is much easier to use when setting / retrieving multiple pins + simultaneously. + +2001-01-22 Brian S. Dean + + * Makefile: Don't gzip the man page. + + * avrdude.1: .Nm macro fix. Submitted by Joerg. + + * main.c: Cosmetic, don't output a preceding linefeed for usage(). + + * Makefile, avr.c, avr.h, fileio.c, term.c: + Makefile : use gzip -f for man page installation so that we don't get + prompted. + + avr.c avr.h fileio.c term.c : + + Change the avrpart data structure so that the typedef AVRMEM is + used as an index into an array for the sizes of the memory types + and also for pointers to buffers that represent the chip data for + that memory type. This removes a lot of conditional code of the + form: + + switch (memtype) { + case AVR_FLASH : + ... + } + + Also, re-code avr_read_byte() and avr_write_byte() to properly + handle the flash memory type without having to tell them whether + they should program the high byte or the low byte - figure that + out from the address itself. For flash memory type, these + routines now take the actual byte address instead of the word + address. This _greatly_ simplifies many otherwise simple + operations, such a reading or writing a range of memory, by not + having to worry about whether the address starts on an odd byte + or an even byte. + +2001-01-20 Brian S. Dean + + * avr.c, avr.h, fileio.c, fileio.h, main.c: + Return error codes instead of exiting, thus making sure that we exit + only via main() so that the exitspecs are properly applied. + + When reading input data from a file, remember how many bytes were read + and write and verify only that many bytes. + + Don't complain when an input file size is smaller than the memory size + we are programming. This is normal. + + * fileio.c: + Correct checksum calculation; failure to account for the value of the + record type was causing non-zero record types to be calculated + incorrectly. + + * Makefile, main.c: Makefile : install the man page + + main.c : drop the giant usage text now that we have a man page. + + * avrdude.1: + Add initial man page graciously contributed by Joerg Wunsch. Thanks + Joerg! + +2001-01-19 Brian S. Dean + + * term.c: + Accept abbreviations for eeprom and flash for the dump and write + commands. + + Fix small bug keeping 1 character command lines from being added to + the history. + + * term.c: + Implement enough state in cmd_dump so that if it is called with no + arguments, it successively dumps the next chunk of data of the same + previously specified length. + + * term.c, term.h, fileio.c, fileio.h, main.c, ppi.c, ppi.h: + * Makefile, avr.c, avr.h, avrprog.c: + The program was getting too large for a single file. Split it up into + more modular pieces. + + Also, accept command abbreviations as long as they are not ambiguous. + + * avrprog.c: + Add ability to specify the state of the power and reset pins on + program exit. Default to leaving the pins in the state they were when + we found them. + + Contributed by: Joerg Wunsch + +2001-01-18 Brian S. Dean + + * Makefile, avrprog.c: + Switch to using readline() for getting terminal input. I can't seem + to get the history capabilities working yet, but even so, it does + better handling of the prompt and strips newlines for us, so it's + still a win. + + Add a few new commands for terminal mode: help, sig, part, erase. + Display rudimentory help using the help command. + + Add some function prototypes. + + * Usage, avrprog.c: + Change -c (interactive command mode) to the more intuitive -t + (terminal mode). + + Make binary format the default for output. + + Update the parts table with corrections for old values and add some + new values. + +2001-01-15 Brian S. Dean + + * avrprog.c: + Automatically verify on-chip data with what we just programmed. + + * avrprog.c, Makefile: + Prepare the Makefile for integration into the FreeBSD ports tree. + + Fix a few "may be used uninitialized" bugs found by -Wall. + +2001-01-14 Brian S. Dean + + * avrprog.c: Free a buffer. + + * avrprog.c: + Use a smarter programming algorithm - read the existing data byte + first and only write the new one if it is different. + + Add -n option which is a test mode in which the chip is not actually + updated. This option does not affect writes in interactive mode. + + * avrprog.c: Add the "dump" and "write" interactive commands. + + * avrprog.c: + Correctly produce and handle "end of record" for intel hex files. + +2001-01-13 Brian S. Dean + + * avrprog.c: + Re-enable writing to the chip. I should probably should make this a + command-line selectable option so that I don't keep forgetting and + committing it with it disabled. + + * avrprog.c: + Add a newline before exiting due to command line errors. Perform a + bit more option compatibility testing between -c, -i, and -o. + + * avrprog.c: Add input file format auto-detection support. + + * Usage, avrprog.c: Say what the defaults are. + + * avrprog-programmer.jpg, Usage, avrprog-schematic.jpg: New files. + + * avrprog.c: Correct usage text. + + * avrprog.c: + Parameterize a few additional items per chip. Print out all per-chip + parameters on startup. Use the per-chip parameters in the code + instead of hard-coded values for the 2313. + + * avrprog.c: Fix filename assignment error. + + Clean up debugging code a little, utilize fileio() instead of making + direct calls to b2ihex(). + + * avrprog.c: A lot of general code cleanup. + + Re-work command line options to be more intuitive. + + Support Intel Hex input and output file formats. Provide hooks to + support Motorola S-Record as well. + + Add a few more part-specific parameters to the avrpart structure. + + Only write the flash or eeprom if the data to be written is not 0xff. + +2000-12-31 Brian S. Dean + + * avrprog.c: Update a comment. + + * avrprog.c: + Provide the ability to tie additionally tie pins 6-9 of the parallel + port to Vcc in order to supply more current. + + Fix a typo on the size of the S1200's Flash. + + Bring RESET low when programming is completed. + + * avrprog.c: + Correct pin connection comments. Elaborate a bit on Vcc connection. + + * avrprog.c: + Update after receiving some good feedback from Joerg Wunsch. We + should now be able to program AT90S1200's. + +2000-12-30 Brian S. Dean + + * avrprog.c: Don't limit eeprom addresses. + +2000-12-20 Brian S. Dean + + * Makefile, avrprog.c: + Add support for the 8515. Make the addition for other devices easier. + +2000-08-27 Brian S. Dean + + * avrprog.c: + Clear all bits except AVR_RESET when finished reading or programming + the Atmel device. + +2000-08-07 Brian S. Dean + + * avrprog.c: update announcement message + + * avrprog.c: Update announcement message. + + * avrprog.c: Return the correct return code from 'main()'. + + * avrprog.c: + Add ppi_pulse() function and fix ppi_toggle() to actully toggle + instead of pulse. + + Make all abnormal returns after the parallel port has been opened go + through a single exit point at the bottom of 'main()'. + +2000-08-06 Brian S. Dean + + * Makefile, avrprog.c: Makefile: add --pedantic compiler option + + avrprog.c: + + Add lots of comments, move getop() variable declarations to + the top of the program. + + Add a typedef name to the AVR memory type and use it for + function declarations. + + Add a usleep() delay in the sense loop to avoid becoming a cpu + hog. + + Print out a version string so that folks know what version of + the software they are running. + + Be sure and close the parallel device and the i/o file when + terminating abnormally. + + * avrprog.c: Print out version information when invoked. + + * Makefile, avrprog.c: Makefile: Add an install target. + + avrprog.c: + + Add license. + + Document the header a bit better. + + Add capability to read out and display the device signature bytes. + + Add capability to power the device from the parallel port. + + Eliminate debug print facility. + + Provide 'avr_cmd()' function. + + When memory locations don't program, generate a newline so that the + information is not overwritten and lost. + + Don't print out the message about needing to specify a file if the + user is not requesting an operation that requires the file. + +2000-08-05 Brian S. Dean + + * avrprog.c: Pring usage when no arguments are supplied. + + * Makefile, avrprog.c: Initial check-in + + * Makefile, avrprog.c: New file. + diff --git a/xs/src/avrdude/ChangeLog-2002 b/xs/src/avrdude/ChangeLog-2002 new file mode 100644 index 000000000..9bfa030a9 --- /dev/null +++ b/xs/src/avrdude/ChangeLog-2002 @@ -0,0 +1,237 @@ +2002-12-12 Brian S. Dean + + * main.c: minor cleanup + +2002-12-07 Brian S. Dean + + * avrdude.1, main.c: + If the stk500 is being used, default to using the first serial port. + +2002-12-03 Brian S. Dean + + * avrdude.1: Mention STK500 support. + +2002-12-01 Brian S. Dean + + * stk500.c: Remove unused code. + + * CHANGELOG, stk500.c: + Document changes since the previous version in the CHANGELOG. + + Cleanup stk500.c a bit. + + * stk500.c: Fix cut and paste braino. + + * avr.c, avrdude.conf.sample, main.c, pgm.h, stk500.c: + The STK500 can perform paged read/write operations even on standard + "non-paged" parts. Take advantage of that and use the faster internal + routines of the STK500 for those parts as well. + + * avr.c, avr.h, avrpart.h, main.c, pgm.c, pgm.h, stk500.c: + Optimize reading and writing for the STK500 programmer if the part + supports paged reads and writes. This greatly decreases the + program/verify time from about 4.5 minutes down to about 10 seconds in + a 12K program size test case. + + Print out the hardware and firmware version for the STK500 if verbose + is enabled. + + * avrdude.conf.sample, avrpart.h, config_gram.y, lexer.l, pgm.h: + * ppi.c, ppi.h, stk500.c, stk500.h, stk500_private.h: + Add basic support for STK500. + +2002-11-30 Brian S. Dean + + * avrdude.conf.sample, config.c, config.h, config_gram.y, lexer.l: + * main.c, pgm.c, pgm.h, ppi.c, ppi.h, term.c, term.h, Makefile: + * avr.c, avr.h: + Seperate programmer operations out into a driver-like interface so + that programmers other than the direct parallel port connection can be + supported. + +2002-11-23 Brian S. Dean + + * CHANGELOG, main.c, term.c: + term.c - when in interactive terminal mode and dumping memory using + the 'dump ' command without any address information, + and the end of memory is reached, wrap back around to zero on + the next invocation. + + CHANGELOG - describe changes + + main.c - update version number + + * main.c: + When getting ready to initiate communications with the AVR device, + first pull /RESET low for a short period of time before enabling the + buffer chip. This sequence allows the AVR to be reset before the + buffer is enabled to avoid a short period of time where the AVR may be + driving the programming lines at the same time the programmer tries + to. Of course, if a buffer is being used, then the /RESET line from + the programmer needs to be directly connected to the AVR /RESET line + and not via the buffer chip. + +2002-11-06 Brian S. Dean + + * CHANGELOG: Update changelog. + + * avr.c, avr.h, main.c: Fix -Y option. Reported by Joerg Wunsch. + +2002-11-01 Brian S. Dean + + * CHANGELOG, main.c: Version update and CHANGELOG entry. + + * avr.c: + Be backward compatible with the 2-byte rewrite cycle counter which + appeared in version 2.1.0, but was changed to a 4 byte counter in + version 2.1.1. Reminded by Joerg Wunsch. + +2002-10-29 Brian S. Dean + + * CHANGELOG, avrdude.1, main.c: + Add '-V' (no verify) flag requested by Joerg Wunsch. Update the man + page. + +2002-10-13 Brian S. Dean + + * CHANGELOG, avrdude.1: Update man page and changelog. + + * main.c: Update version number. + +2002-10-12 Brian S. Dean + + * Makefile: Remove --pedantic and -g from the compiler options. + +2002-10-11 Brian S. Dean + + * avr.c, term.c: + Use a four byte value instead of a two byte value for the programming + cycle count stored at the end of EEPROM. It seems as though Atmel was + greatly conservative in claiming a 1000 count reliability for the + FLASH. I current have a part that has been reprogrammed 173330 times, + and counting. + + Fix a compiler warning. + + * avrdude.conf.sample: + Fix ATMega128 instruction encoding for reading the low and high fuse + bits. Thanks to Joerg Wunsch for tripping over this. + +2002-08-01 Brian S. Dean + + * avr.c, avrdude.1, main.c: + Move erase-rewrite cycle increment to within the chip erase routine so + that it is tracked no matter where the erase was initiated: command + line mode or interactive mode, without code duplicaiton. + + * CHANGELOG: Recent updates. + + * avr.c: Eliminate unused variables. + + * avr.c, avr.h, avrdude.1, fileio.c, main.c: + Implement a way of tracking how many erase-rewrite cycles a part has + undergone. This utilizes the last two bytes of EEPROM to maintain a + counter that is incremented each time the part is erased. + +2002-07-27 Brian S. Dean + + * avr.c, main.c: + Fix a typo in a comment. Display the size of memory being written. + Display the correct memory name in an error message (previously + hardcoded). + +2002-06-22 Brian S. Dean + + * CHANGELOG, avrdude.conf.sample: + Add support for ATtiny15 - contributed by Asher Hoskins + + +2002-04-23 Brian S. Dean + + * CHANGELOG: Say what changed. + +2002-04-07 Brian S. Dean + + * Makefile, avrdude.conf.sample: + Backup the config file to a timestamped name to keep from possibly + overwriting user-modified configs. + + Add read/write instructions for all memory types for ATMEGA103, + ATMEGA128, ATMEGA16, and ATMEGA8. + +2002-04-05 Brian S. Dean + + * avrdude.conf.sample: + Add support for ATMEGA128; untested; requested by Jeff Gardner + . + +2002-02-15 Brian S. Dean + + * avrdude.conf.sample: Minor ordering. + + * CHANGELOG, main.c: Update version numbers. + +2002-02-14 Brian S. Dean + + * CHANGELOG: Summarize latest updates. + + * avrdude.conf.sample, config_gram.y: + Make pwroff_after_write a yes/no field instead of a numeric. + + * avrdude.conf.sample: Document the pwroff_after_write flag. + + * avr.c: Enable the extra part verbosity when verbosity >= 3. + + * avr.c, avr.h, avrdude.conf.sample, config_gram.y, lexer.l: + * main.c, term.c: + Fix error reporting by avr_write_byte(). + + Fix setting of status LEDs under various write-fail conditions. + + Add a flag to indicate that a memory type requires the device to + possibly be powered off and back on after a write to it. This is due + to a hardware problem on some Atmel devices, see: + + http://www.atmel.com/atmel/acrobat/doc1280.pdf + + Add greater verbosity to the part-display code when verbose>1 to + display avrprog's encoding of the defined programming instructions. + This is primarily for debugging purposes. + + + Part updates: + + * add the AT90S4414 part + + * add fuse and lock bit access instructions for the AT90S1200, + AT90S4434, and AT90S8515. + + * add the pwroff_after_write flag to the fuse bits for the AT90S2333 + and AT90S4433 parts + +2002-02-09 Brian S. Dean + + * avrdude.conf.sample: + Updates to the 2333 and 4433 parts, contributed by Joerg Wunsh. + +2002-01-18 Brian S. Dean + + * CHANGELOG: Add changelog. + +2002-01-12 Brian S. Dean + + * main.c: Add (c) to copyright. + + * fileio.c, fileio.h, lexer.l, lists.c, lists.h, main.c: + * pindefs.h, ppi.c, ppi.h, term.c, term.h, avr.c, avr.h: + * config.c, config.h, config_gram.y: + Update version number. Update copyright. + + * avrdude.1: Update copyright and add description of "default". + + Submitted by: Joerg Wunsch + + * avr.c, term.c: + Fix programming of write-only memories (such as lock bits on the + 2313). + diff --git a/xs/src/avrdude/ChangeLog-2003 b/xs/src/avrdude/ChangeLog-2003 new file mode 100644 index 000000000..1115bdfbc --- /dev/null +++ b/xs/src/avrdude/ChangeLog-2003 @@ -0,0 +1,1095 @@ +2003-12-01 Eric B. Weddington + + * doc/avrdude.texi: Update devices and programmers supported. + +2003-12-01 Eric B. Weddington + + * doc/avrdude.texi: Add missing -D option to user manual. + [This fixes bug #6804] + +2003-11-30 Jan-Hinnerk Reichert + + * avrpart.c,main.c: Moved list_parts() and locate_part() + from main.c to avrpart.c. + * avrpart.h: Added prototypes for list_parts() and + locate_part(). + +2003-11-30 Jan-Hinnerk Reichert + + * avrpart.c, avr.c: Moved elementary functions on types + OPCODE, AVRMEM and AVRPART from avr.c to new file avrpart.c. + * avr.h: Removed prototypes for moved functions. + * avrpart.h: Added prototypes for functions in avrpart.c. + * Makefile.am: Added new file avrpart.c. + +2003-11-28 Michael Mayer + + * lexer.l: New programmer type "butterfly". + * config_gram.y: New token K_BUTTERFLY. + * avrdude.conf.in: Added programmer definition. + * butterfly.c, butterfly.h: Cloned from avr910.?, changed to work + with the Atmel Butterfly device. + * Makefile.am: Added butterfly.[ch] to avrdude_SOURCES. + +2003-11-26 Joerg Wunsch + + * main.c: Make the -U parser tolerate colons in filenames. + * avrdude.1, doc/avrdude.texi: Document the -U changes. + +2003-11-21 Jan-Hinnerk Reichert + + * ppi.c: Major speed tuning. Since ioctl() is expensive read from + shadowregisters where possible. + +2003-11-19 Eric B. Weddington + + * NEWS: Update news from items in ChangeLog. + +2003-11-19 Theodore A. Roth +[Contributed by Jan-Hinnerk Reichert ] + + * avr.c (avr_write_byte_default): Improve polling algorithm to speed up + programming of byte oriented parallel programmers. + +2003-11-14 Brian S. Dean +[Contributed by Erik Christiansen ] + + * avrdude.conf.in: + Add ATmega64 part. + +2003-11-08 Joerg Wunsch + + * avrdude.conf.in: + Add "fuse" and "lock" definitions for the AT90S8535. Actually, + this is stolen from the AT90S8515 since the datasheet says it's + the same there. + +2003-10-13 Bill Somerville + + * stk500.c (stk500_paged_write): Limit blocks written to no bigger + than memory device size. + (stk500_paged_write): Send whole block at once. + (stk500_paged_load): Limit blocks read to no bigger than memory + device size. + [This fixes bug #5713.] + +2003-10-13 Eric B. Weddington + + * avrdude.conf.in: Fix for unterminated character error. + +2003-10-13 Eric B. Weddington + + * avrdude.conf.in: Add ATmega8515 definition. + Contributed by: Matthias Weier + * NEWS: Add note about ATmega8515 definition. + +2003-09-24 Eric B. Weddington + + * doc/TODO: Updated TODO list. + +2003-09-22 Eric B. Weddington + + * windows/Makefile.am: Correct makefile so loaddrv does not link + to Cygwin DLL. + +2003-09-18 Eric B. Weddington + + * doc/avrdude.texi: Minor corrections. Change description of -P + to reference platform dependencies. + +2003-09-16 Eric B. Weddington + + * stk500.c: If writing flash, skip empty pages in paged write. + +2003-09-06 Theodore A. Roth + + * NEWS: Add 'Current:' header. + * configure.ac (AC_INIT): Add cvs back to version since we're + back in dev cycle (post release). + +2003-09-06 Theodore A. Roth + + * AVRDUDE 4.2.0 has been released (cvs release tag is "release_4_2_0"). + +2003-09-06 Theodore A. Roth + + * NEWS: Update for 4.2.0 release. Add note about read/write of fuses + support for avr910. + * configure.ac (AC_INIT): Set version to 4.2.0. + +2003-09-05 Theodore A. Roth +[Contributed by Jan-Hinnerk Reichert ] + + * avr.c (avr_read_byte): If pgm->read_byte method fails, retry with + avr_read_byte_default. + * avr.c (avr_write_byte): If pgm->write_byte method fails, retry with + avr_write_byte_default. + * avr910.c (avr910_cmd): Implement using universal command. + +2003-09-04 Theodore A. Roth + + * Makefile.am: Change AM_CPPFLAGS to avrdude_CPPFLAGS. + Define avrdude_CFLAGS. + * configure.ac: Set ENABLE_WARNINGS to "-Wall" if using gcc. + +2003-09-02 Eric B. Weddington + + * doc/avrdude.texi: Add note about privileges needed to load + the giveio driver for Windows. + +2003-08-29 Brian S. Dean + + * avrdude.1: + * main.c: + Perform an auto erase before programming if the flash memory is + anywhere specified to be written by any of the -U requests. + + To remain backward compatible with previous versions, disable this + feature if any of the old-style memory specification operations are + specified (-i, -o). + + Implement the -D option to explicitly disable the auto erase default. + + Deprecate the old-style memory specification options (-f, -i, -I, -m, + and -o) in favor of the new -U option which allows one to operate on + multiple memories on a single command line. + +2003-08-28 Eric B. Weddington + + * avr910.c: + * fileio.c: + * main.c: + * stk500.c: + More code cleanup to remove warnings. + +2003-08-27 Theodore A. Roth + + * main.c (update_progress_no_tty): Properly terminate progress. Also + fixes stk500 problem where number of bytes written is less than a page. + +2003-08-27 Theodore A. Roth + + * avrdude.spec.in: Fix broken rpmbuild on RedHat-9. + +2003-08-25 Eric B. Weddington + + * fileio.c: + * main.c: + * ppiwin.c: + * ser_posix.c: + * stk500.c: + Minor code cleanup to remove warnings. + +2003-08-21 Brian S. Dean + + * avrdude.1: + * main.c: + + Introduce a new option, -U, for performing memory operions. + Its argument is a 4 field string (fields seperated by colons) + which indicate what memory type to operate on, what operation + to perform is (read, write, or verify), the filename to read + from, write to, or verify against, and an optional file format + field. Multple -U options can be specified to operate on more + than one memory at a time with a single invocation. For + example, to update both the flash and the eeprom at the same + time one can now specify the following: + + avrdude -p -e -U flash:w:main.hex:i -U eeprom:w:eeprom.hex:i + +2003-08-20 Brian S. Dean + + * ppiwin.c: + Timing related fixes for the Windows platform. Several folks have + reported that this patch fixes verify errors on the Windows platform + that are apparently timing related. Submitted by: Alex Shepherd + , who indicates that this patch was based on + code from the UISP project. + +2003-08-01 Theodore A. Roth + + * avrdude.1: Document the -q option. + * doc/avrdude.texi: Document the -q option. + Fix some typos left over from pasting in man output. + +2003-07-30 Brian S. Dean + + * main.c: Add elapsed time information to the new progress bar. + +2003-07-29 Theodore A. Roth + + * avr.c: + * avr.h: + * avr910.c: + * main.c: + * stk500.c: + New progress reporting implementation. + +2003-07-24 Joerg Wunsch + + * avrdude.1: + * doc/avrdude.texi: + * pgm.c: + * pgm.h: + * stk500.c: + * stk500_private.h: + * term.c: Add support for displaying and setting the various + operational parameters of the STK500 (Vtarget, Varef, clock). + +2003/07/22 Brian S. Dean + + * avrdude.conf.in: + Add 'picoweb' programming cable programmer. + Contributed by Rune Christensen . + +2003-06-18 Brian S. Dean + + * avrdude.conf.in: + Add the 'sp12' (Steve Bolt's) programmer. + Submitted by Larry Barello . + +2003-06-17 Brian S. Dean + + * avrdude.conf.in: + Properly identify the "ALF" programmer. + + Extend ATmega8 calibration memory to support all 4 calibration bytes. + Savannah bug #3835. Submitted by Francisco T. A. Silva + . + + Add a few AVR910 programmer device codes. Savannah bug #3569 - sorry + I can't tell who submitted this to give proper credit. + + Add support for the ATtiny12. Submitted by Pontifex + +2003-05-22 Brian S. Dean + + * avr.c: + * avr.h: + * fileio.c: + Optimize flash memory handling a little bit by ignoring 0xff data that + resides above the last non-0xff data value in the address space. Only + do this for flash memory since writing a 0xff to flash is a no-op. + This has the affect of creating smaller output files when dumping + memory contents from flash if the program in flash does not consume + the whole memory space. It also results in shorter programming times + when avrdude is asked to load a file into flash that has lots of 0xff + filled data past the last non-0xff data value. + +2003-05-13 Theodore A. Roth + + * avr910.c (avr910_paged_write_flash): Add code to send the 'm' + command ("issue page write" cmd) for each page. + +2003-05-13 Theodore A. Roth + + * avrdude.conf.in: Add pagel and bs2 entries for at90s1200 device. + +2003-05-13 Theodore A. Roth + + * doc/TODO: Add note about avr910 device codes. + +2003-05-04 Theodore A. Roth + + * configure.ac: Check for ncurses library (since it can be a + replacement for termcap). + +2003-05-02 Theodore A. Roth + + * avrdude.conf.in: Add avr decodes for devices known in avr910 + firmware version 2.3. + Add missing stk500 devocde for 2343. + +2003-04-23 Eric B. Weddington + + * fileio.c: Fix for bug #3293. Set correct open mode for raw format + for Windows. + +2003-04-19 Brian S. Dean + + * avrdude.1: + * fileio.c: + * fileio.h: + * main.c: + Implement and "immediate mode" for file input - this allows + one to specify byte values on the command line instead of via + a file. This can be good for specifying fuse bytes and + eliminates the need to create single-byte files or using + interactive terminal mode for these single-byte memories. + Requested by several folks on the mailing list. + +2003-04-18 Theodore A. Roth + + * configure.ac: Add cvs suffix back to version. + * doc/TODO: Add a few items. + +2003-04-18 Theodore A. Roth + + * AVRDUDE 4.1.0 has been released (cvs release tag is "release_4_1_0"). + +2003-04-17 Theodore A. Roth + + * configure.ac: Set version to 4.1.0. + * doc/avrdude.texi: Add note about avr910 programmer type. + +2003-04-17 Eric B. Weddington + + * NEWS: Replace TBD with new release version. + +2003-04-17 Eric B. Weddington + + * avrdude.conf.in: Change name of pony programmer to pony-stk200 + to better describe the hardware (PonyProg is software that works + with various hardware). + +2003-04-16 Eric B. Weddington + + * avrdude.conf.in: Add support for ATtiny26 + Submitted by Artur Lipowski + * NEWS: List new devices supported: ATtiny26 + +2003-04-16 Eric B. Weddington + + * avrdude.conf.in: Add support for ATmega8535 + Submitted by Alexander Peter + * NEWS: List new devices supported: ATmega8535 + +2003-04-09 Theodore A. Roth + + * avr910.c: Reading a 16 bit word in paged load needs to swap the + bytes since the 'R' command returns MSB first and the internal buffer + stores LSB first. + +2003-04-07 Theodore A. Roth + + * stk500.c: Don't print out read/write byte progress unless the verbose + option is given. + +2003-04-05 Theodore A. Roth + + * avr910.c: Re-add the avr910 byte read/write methods which were + removed in my previous patch. Terminal mode read/writes are broken + without those methods. D'oh! + +2003-04-05 Theodore A. Roth + + * avr910.c: Refactor to allow probing for auto addr increment. If auto + incr supported by programmer hw, don't send addr for every byte. + +2003-04-03 Eric B. Weddington + + * confwin.c: Fix bug that allows garbage for non-existent user + config filename on Windows. + +2003-03-29 Brian S. Dean + + * avrdude.conf.in: + Add the ATmega32 part. This part definition was contributed by: + Daniel Williamson and + Ruwan Jayanetti + The resulting part definition used was actually somewhat of a merge of + the two submitted definitions. + +2003-03-24 Theodore A. Roth + + * NEWS: Add note about avr910 support. + +2003-03-23 Theodore A. Roth + + * avr.c (avr_write): Add call to pgm->write_setup() before the write + loop. + * avr910.c: Change all show_func_info() calls to no_show_func_info(). + Add read/write to/from flash/eeprom memory functionality. + * pgm.c: Initialize pgm->write_setup. + * pgm.h: Add write_setup field to PROGRAMMER structure. + * ser_posix.c: Remove unneeded cast in verbosity code. + +2003-03-23 Theodore A. Roth + + * ser_posix.c: Limit verbose output to 2 chars. + +2003-03-23 Theodore A. Roth + + * ser_posix.c: Add verbose level > 3 output for send and recv functions. + +2003-03-23 Theodore A. Roth + + * avr.c: Add avr_read_byte_default(). + Have avr_read_byte() call pgm->read_byte() or avr_read_byte_default(). + Add avr_write_byte_default(). + Have avr_write_byte() call pgm->write_byte or avr_write_byte_default(). + * pgm.c: Initialize pgm->write_byte and pgm->read_byte. + * pgm.h: Add write_byte and read_byte fields to struct programmer_t. + +2003-03-17 Theodore A. Roth + + * avrdude.conf.in: Fix typo for devicecode deprecation comment. + +2003-03-17 Eric B. Weddington + + * avrdude.conf.in: Add Bascom SAMPLE programmer. + Submitted by Larry Barello + +2003-03-16 Theodore A. Roth + + * avr.c (avr_read): Use pgm->read_sig_bytes to read signature bytes if + available. + * avr910.c (avr910_vfy_cmd_sent): New function. + (avr910_chip_erase): Add support for chip erase. + (avr910_enter_prog_mode): New function. + (avr910_leave_prog_mode): New function. + (avr910_initialize): Add code to select device type and enter prog mode. + (avr910_close): Leave programming mode before closing serial port. + (avr910_read_sig_bytes): New function. + (avr910_initpgm): Add avr910_read_sig_bytes method to pgm initializer. + * avrdude.conf.in: Add note about deprecating devicecode. + Change all occurences of devicecode to stk500_devcode. + Add avr910_devcode to a few parts for testing. + * avrpart.h (struct avrpart): Change devicecode field to stk500_devcode. + (struct avrpart): Add avr910_devcode field. + * config_gram.y: Add K_STK500_DEVCODE and K_AVR910_DEVCODE tokens. + Generate an error if devicecode is found in the config file. + Handle parsing of avr910_devcode and stk500_devcode. + * lexer.l: Handle parsing of avr910_devcode and stk500_devcode. + * pgm.c: Initialize pgm->read_sig_bytes field. + * pgm.h: Add pgm->read_sig_bytes field. + * stk500.c: Use stk500_devcode instead of devicecode. + +2003-03-16 Theodore A. Roth + + * avrdude.conf.in: Add avr910 and pavr programmers. + * config_gram.y: Add parsing of avr910 programmer. + * lexer.l: Add avr910 token. + * avr910.c: [this is still work in progress] + Add some debug output. + Add probe for programmer presense. + * main.c: Set port to default_serial if programmer type is avr910. + +2003-03-13 Theodore A. Roth + + * ser_posix.c, ser_win32.c, serial.h: + Change baud from int to long to avoid a 16-bit int overflow. + +2003-03-12 Theodore A. Roth + + * Makefile.am (avrdude_SOURCES): Add avr910.[ch], serial.h and + ser_posix.c files. + * avr910.c: New file (stubs for avr910 serial programmer). + * avr910.h: New file. + * ser_posix.c: New file. + * ser_win32.c: New file (just stubs for now). + * serial.h: New file. + * stk500.c: Move all the code for accessing the posix serial ports + into ser_posix. This will make a native win32 port easier and allows + the avr910 programmer to share the serial code. + +2003-03-12 Theodore A. Roth + + * configure.ac (AC_INIT): Set version to 4.0.0cvs since we're done + with 4.0.0 release. + +2003-03-12 + + * AVRDUDE 4.0.0 has been released (cvs release tag is "release_4_0_0"). + +2003-03-11 Theodore A. Roth + + * Makefile.am: Add CLEANFILES to remove all files from a make. + * doc/Makefile.am: Ditto + +2003-03-11 Theodore A. Roth + + * windows/Makefile.am: Fix uninstall-local rule (forget the $$file + part of the rm command). + +2003-03-11 Theodore A. Roth + + * AUTHORS: Updated. + * CHANGELOG: Move contents to NEWS and remove file. + * ChangeLog: All of the changes for this year. + * ChangeLog-2001: All 2001 changes. + * ChangeLog-2002: All 2002 changes. + * Makefile.am (EXTRA_DIST): Remove CHANGELOG and and Change-200[12]. + * NEWS: Moved contents of CHANGELOG file here. + * README: Add note pointing to savannah site. + +2003-03-11 Eric Weddington + + * doc/avrdude.texi: + Add Install and Documentation sections for Windows. Fix typo. + +2003-03-10 Theodore A. Roth + + * Makefile.am: * Makefile.am (EXTRA_DIST): Add CHANGELOG. + +2003-03-10 Brian S. Dean + + * stk500.c: Disable debugging printf. + + * configure.ac: Update version number in preparation for release. + +2003-03-10 Theodore A. Roth + + * doc/avrdude.texi: + Add comment before each node to make them stand out better. + Use @option{} command for options instead of @code{}. + Merge FreeBSD and Linux platform dependent information. + +2003-03-10 Brian S. Dean + + * avrdude.1: Minor man page updates to better reflect reality. + +2003-03-10 Joerg Wunsch + + * bootstrap: + Export all the AUTO* variables. Hopefully, that way the generated + Makefile might get them correctly. + + * bootstrap: + Export ${AUTOCONF} so automake will find it by whatever name it will be + called today. + +2003-03-06 Eric Weddington + + * doc/avrdude.texi: + Add notes about ability to list parts and list programmers in the + config file in -p and -c descriptions. Change info about where to + find Windows search method in -C description. + + * main.c: + Change software version from hardcoded value to getting it from + the configuration. + +2003-03-06 Theodore A. Roth + + * avrdude.spec.in: * avrdude.spec.in: Add docs sub-package. + Add %post and %preun scriptlets for handling info files. + + * configure.ac, doc/Makefile.am: + * configure.ac: Add --enable-versioned-doc option and set DOC_INST_DIR. + * doc/Makefile.am: Add rules to install docs in DOC_INST_DIR. + + * doc/Makefile.am: + Delete the lines which where commented out in previous commit. + + * configure.ac, doc/Makefile.am: + * configure.ac: Remove hack to make work with automake-1.5. + * doc/Makefile.am: Remove extra rules that were needed to work with + automake-1.5. + + * bootstrap: + * bootstrap: Force use of autoconf-2.57 and automake-1.7.x. + +2003-03-05 Joerg Wunsch + + * avrdude.conf.in: Add a definition for the popular Ponyprog dongle. + + Submitted by: Daniel Williamson + +2003-03-05 Brian S. Dean + + * main.c: + Check the programmer type against 'STK500' instead of the programmer + name when checking to see if we should default to the default_serial + port instead of the default_parallel port. This has us do the right + thing for the new 'avrisp' programmer. + + * stk500.c: + Make the page size used for non-paged parts for the 'paged_write' + command be 128 bytes. This cuts 6 seconds off the programming time + for uploading a 6K file into an AT90S8515 vs the time loading the same + file using a 16 byte buffer, and the response feedback is still good. + + * avr.c, stk500.c: + Fix stk500 page write (Program Page command). This is supported after + all on non-paged-memory parts. The problem was that the page size was + defaulting to 256 (maximum for the stk500), but the timeout for a + response from the stk500 before declaring it dead was only 0.5 + seconds. But it takes much longer than 0.5 seconds to program 256 + bytes, so we just weren't waiting long enough. + + Fix this in two ways - increase the timeout to 5 seconds, and decrease + the page size to 16 bytes for non-paged parts. The programming time + for 16 bytes is short enough to provide the user with some feedback + that something is happening. + + * avr.c, stk500.c: + Don't call the programmer's 'paged_write' routine unless the memory + itself is paged as it doesn't appear to work otherwise. + + * avrdude.conf.in: Fix device codes for at90s8515 and at90s8535. + + * avrdude.conf.in: + Add PAGEL and BS2 parms for parts I have datasheets for. + + * config_gram.y: + Do that last commit slightly differently - this way results in no + shift-reduce conflicts. + + * config_gram.y: + It shouldn't be an error to have an empty configuration file. This + causes some shift-reduce conflicts, but I think they are OK. + + * main.c: + Print out a list of valid parts for '-p ?' and a list of valid + programmers for '-c ?'. + +2003-03-04 Eric Weddington + + * doc/avrdude.texi: Minor Windows doc corrections. + + * doc/TODO: Add TODO file. + + * avrdude.conf.in: Add AVR ISP programmer. + +2003-03-04 Brian S. Dean + + * stk500.c: + Don't try to set extended device programming parameters if they + haven't been specified in the config file for the part. + + * stk500.c: Set extended device parameters for all firmware versions. + + * stk500.c: + First attempt at supporting STK500 firmware past 1.10. Thanks to + Jason Kyle for the needed protocol information. + +2003-03-03 Theodore A. Roth + + * doc/Makefile.am: + * doc/Makefile.am: Add ps and pdf rules since they aren't supplied by + automake versions prior to 1.7. + + * doc/avrdude.texi: + * doc/avrdude.texi: Add node and menu information for the info system. + + * Makefile.am, configure.ac, doc/Makefile.am, doc/avrdude.texi: + * Makefile.am (SUBDIRS): Add doc dir. + * configure.ac (AC_CONFIG_FILES): Add doc/Makefile. + * doc/Makefile.am: New file. + * doc/avrdude.texi: Use automatically generated version.texi. + +2003-03-02 Brian S. Dean + + * doc/avrdude.texi: Initial manual. + +2003-02-27 Theodore A. Roth + + * term.c: * term.c: Use fgets() if readline() is not available. + +2003-02-27 Joerg Wunsch + + * bootstrap: + Oops, accidentally spammed the repository with my private version of + "bootstrap". Back out that change. + + * bootstrap, lexer.l: + Ignore \r as white space, to make the Windows people happy. + +2003-02-27 Theodore A. Roth + + * Makefile.am (EXTRA_DIST): Add avrdude.spec and make entries one + per line so future patches are obvious as to what changed. + * avrdude.spec.in: New file to support creation of binaries in rpm + format. + * configure.ac (AC_OUTPUT): Add avrdude.spec. Reorder so that + Makefile is the last entry. + +2003-02-26 Theodore A. Roth + + * Makefile.am (SUBDIRS): Add windows dir. + * configure.ac: If $target is a windows system, build whats in + windows sub dir. + * windows/Makefile.am: New file. + +2003-02-25 Theodore A. Roth + + * ChangeLog: Point reader to the CHANGELOG file. + * Makefile.am (EXTRA_DIST): Rename avrdude.conf.sample to + avrdude.conf.in. + Remove avrdude.conf and distclean-local rules. + Add install-exec-local and backup-avrdude-conf rules. + * avrdude.conf.in: + Set default_parallel to "@DEFAULT_PAR_PORT@" for autoconf expansion. + Set default_serial to "@DEFAULT_SER_PORT@" for autoconf expansion. + * configure.ac: Add call to AC_CANONICAL_{BUILD,HOST,TARGET} macros. + Set DEFAULT_PAR_PORT and DEFAULT_SER_PORT based on $host. + Add copyright header. + Define avrdude_version so AC_INIT and AM_INIT_AUTOMAKE are sure + to get the same version. + + * avrdude.conf.in, avrdude.conf.sample: + Renamed avrdude.conf.sample to avrdude.conf.in. + +2003-02-25 Eric Weddington + + * ppiwin.c: CRs again. + + * confwin.c, confwin.h: Get rid of CRs. + + * main.c, Makefile.am: Get rid of CRs again. + +2003-02-24 Joerg Wunsch + + * avrdude.1: Atmel has rearranged their web site, so now the AVR + docs have been moved to a more logically sounding URL. + +2003-02-24 Eric Weddington + + * Makefile.am, main.c: Integrate Windows search of config files. + + * confwin.c, confwin.h: config file search on Windows. + + * ppiwin.c: Change port value from lpt1alt to lpt3. Other + formatting changes. + + * windows/giveio.c: + Add giveio device driver source. Requires MS DDK to build. + + * windows/giveio.sys: Add giveio device driver binary. + + * giveio.sys, install_giveio.bat, remove_giveio.bat, status_giveio.bat: + Move Windows specific files. + + * windows/loaddrv.c, windows/loaddrv.h, windows/remove_giveio.bat: + * windows/status_giveio.bat, windows/install_giveio.bat: + Add Windows specific files. + + * main.c: Usage back to stderr. + +2003-02-22 Brian S. Dean + + * CHANGELOG: Add note about .avrduderc. + + * avr.c, avrdude.conf.sample, avrpart.h, config_gram.y, main.c, + * par.c, pgm.c, pgm.h: + Add the ability to read a per-user config file located at + $HOME/.avrduderc. Entries from .avrduderc take precedence over those + from the system wide config file in ${PREFIX}/etc/avrdude.conf. + + Track and display the config file name and line number when we print + out the available parts and programmers. This is useful in case + someone has overridden a definition in their .avrduderc file and is + wondering why the definition in the system wide config file is not + being used. + + Remove the default programmer 'stk500' from the distributed config + file. + + * CHANGELOG: Spelling. + +2003-02-21 Brian S. Dean + + * CHANGELOG: + Put some stuff in the CHANGELOG for this upcoming new version before I + forget. + + * main.c: + Update comment due to removal of the default parallel port pin config. + + * config.c, config.h, config_gram.y, lexer.l, main.c: + * avrdude.conf.sample: + Introduce 'default_programmer' to the config file instead of requiring + one of the programmers to be tagged "default" within its definition. + + Also, axe the notion of a compiled-in default programmer. It is + kind've pointless now that nearly all configuration comes from the + config file, thus, avrdude is not very useful without the config file, + and thus, having a programmer compiled-in offers little or no benefit. + +2003-02-21 Eric Weddington + + * main.c: Change usage text to be verbose. + + * giveio.sys: Add Windows parallel port device driver (binary). + + * install_giveio.bat, remove_giveio.bat, status_giveio.bat: + Windows batch files to work with giveio.sys. + +2003-02-21 Brian S. Dean + + * avrdude.conf.sample, config.c, config.h, config_gram.y, lexer.l: + * main.c: + Add port name defaults to the config file instead of hard-coding. + This adds 'default_parallel' and 'default_serial' keywords to the + grammar, which take quoted string arguments. + + * avrdude.conf.sample: + Document the recent additions to the config file. + + * stk500.c, avr.c, avrpart.h, config_gram.y, lexer.l, par.c: + Add the ability to specify which pin to pulse when retrying entry into + programming mode. Use 'retry_pulse' in the per-part specification + that can currently take values of 'reset' or 'sck', the default being + 'sck' which preserves the previous behaviour. Some newer parts + indicate that /RESET should be pulsed, while older parts say to pulse + SCK. + +2003-02-20 Eric Weddington + + * main.c, par.c: + Make verbose global. Make debug code in par_cmd() based on verbose=2. + +2003-02-20 Brian S. Dean + + * stk500.c: Fix pseudo/full parallel mode selection logic. + + * avrdude.conf.sample: + Woops, didn't really mean to commit those changes that slipped in with + the last commit. Those were just there for testing. + + * avr.c, avrdude.conf.sample, avrpart.h, config_gram.y, lexer.l: + * stk500.c: + Add 'serial' and 'parallel' keywords to the grammar so that one can + say whether parts support these programming modes or not. Possible + values for 'serial' are 'yes' or 'no'. Possible values for 'parallel' + are 'yes', 'no', or 'pseudo'. Add a bit mask of flags to the AVRPART + structure to capture these settings. Use these within + stk500_initialize() to set the device parameters correctly. + + Defaults for 'serial' and 'parallel' are 'yes' unless specified + otherwise. + +2003-02-20 Eric Weddington + + * Makefile.am, ppiwin.c: Get rid of CRs. + + * Makefile.am: Add ppiwin.c to avrdude_SOURCES. + + * ppiwin.c: Added ppiwin.c: Windows parallel port driver. + + * stk500.c: + Add error message for fail to enter programming mode. Fix typos. + +2003-02-20 Brian S. Dean + + * avr.c, avrdude.conf.sample, avrpart.h, config_gram.y, lexer.l: + Add a few parameters needed for parallel programming: assignment of + PAGEL and BS2 signals and the disposition of the reset pin + ('dedicated' or 'io'). + +2003-02-20 Theodore A. Roth + + * avrdude.1: Fix spacing for m169 entry. (tabs not spaces ;-) + +2003-02-20 Brian S. Dean + + * avrdude.1, fileio.c, main.c: Add Motorola S-record support. + + Submitted by: "Alexey V.Levdikov" + +2003-02-19 Theodore A. Roth + + * avrdude.1: Add m169 to list of supported targets. + +2003-02-19 Joerg Wunsch + + * avrdude.conf.sample, avrdude.1: + My colleague contributed a part definition for the AT90S2343. + + Submitted by: Mirko Kaffka + +2003-02-18 Theodore A. Roth + + * avrdude.conf.sample: + Add support for mega169. (tested with stk500 with 1.7 firmware) + + * avrdude.conf.sample: + Add commments to separate parts (makes it easier for the eye to parse). + +2003-02-15 Theodore A. Roth + + * Makefile.am: Add $srcdir to sample config filename so that + building in a separate dir works. + +2003-02-15 Joerg Wunsch + + * Makefile.am: + Only GNU make sets $< in non-inference rules, so rather explicitly + spell the source file(s) to remain compatible. + +2003-02-14 Theodore A. Roth + + * Makefile.am: Add distclean rule and EXTRA_DIST list to get 'make + distcheck' to succeed. + + These changes add basic support for a autoconf/automake based + build system. + + * .cvsignore: Ignore autoconf files. + * AUTHORS: New file. + * ChangeLog: New file. + * Makefile: Removed file. + * Makefile.am: New file. + * NEWS: New file. + * README: New file. + * bootstrap: New file. + * configure.ac: New file. + * avr.c: Include ac_cfg.h (generated by autoconf). + * config.c: Include ac_cfg.h. + Include config_gram.h instead of y.tab.h. + * config.h: If HAS_YYSTYPE is not defined, define YYSTYPE. + * config_gram.y: Include ac_cfg.h. + * fileio.c: Include ac_cfg.h. + * lexer.l: Include config_gram.h instead of y.tab.h. + * lists.c: Include ac_cfg.h. + * main.c: Include ac_cfg.h. + * par.c: Include ac_cfg.h. + * pgm.c: Include ac_cfg.h. + * ppi.c: Include ac_cfg.h. + * stk500.c: Include ac_cfg.h. + * term.c: Include ac_cfg.h. + +2003-02-14 Brian S. Dean + + * stk500.c: Fix typos. Fix error messages. + +2003-02-13 Brian S. Dean + + * Makefile, avrdude.conf.sample, config_gram.y, lexer.l, main.c: + * par.c, par.h, ppi.c, ppi.h, stk500.c: + Split higher level parallel port programmer code off from ppi.c into + its own file par.c, leaving low level parallel port accessor routines + in ppi.c to help with portability. Change the programmer type to + 'PAR' now instead of 'PPI' - 'PAR' represents the parallel port + programmer type. + + Be more liberal with 'static' function declarations within the + programmer implimentation files - these functions should never be + called directly - always use the programmer function references. + + There are still a few places in 'main.c' that directly reference the + parallel programmer explicitly (par_getpinmask). These should be + fixed somehow. + + Axe a few unused functions. + +2003-02-12 Theodore A. Roth + + * .cvsignore: New file. + + * stk500.c: Remove need for inttypes.h. + + * lexer.l: Define YY_NO_UNPUT to quell a compiler warning. + + * Makefile: Remove YACC assignment. + Add '-b y' options to YACC invocation. + Remove leading '-' from 'include .depend'. + +2003-02-12 Joerg Wunsch + + * config_gram.y: + Declare the internally used static functions on top, to get rid of the + compiler warnings. + + Reported by: bison-generated parsers + +2003-02-11 Theodore A. Roth + + * linux_ppdev.h: New file. + * ppi.c: Include system dependant parallel port interface file. + (ppi_open): Add call to ppi_claim(). + (ppi_close): Add call to ppi_release(). + * ppi.h: Define ppi_claim() and ppi_release() as NOPs if not previously + defined. + * stk500.c: Include inttypes header to quell compiler warning. + +2003-02-11 Joerg Wunsch + + * pgm.c, ppi.c, stk500.c: Fix some implicit declaration warnings. + + * config_gram.y: + Move the C declarations to the top of the file. While [b]yacc doesn't + care, bison does, and this is normally the way it's meant to be + anyway. + +2003-02-11 Theodore A. Roth + + * Makefile: Generate dependencies specific to the target system. + Explicitly use byacc. + + * Makefile: + Remove reference to avr-gcc in depend rule (cut & paste error). + +2003-02-09 Brian S. Dean + + * main.c, pgm.c, pgm.h, pindefs.h, ppi.c, ppi.h, stk500.c: + * stk500.h, stk500_private.h, term.c, term.h, CHANGELOG, COPYING: + * Makefile, avr.c, avr.h, avrdude.1, avrdude.conf.sample: + * avrdude.pdf, avrpart.h, config.c, config.h, config_gram.y: + * fileio.c, fileio.h, lexer.l, lists.c, lists.h: + Test commit in new public repository. Before this time this repo + existed on a private system. Commits made by 'bsd' on the old system + were made by Brian Dean (bdean on the current system). + +2003-02-08 Brian S. Dean + + * Makefile, avr.c, avr.h, avrdude.1, avrpart.h, config.c, + * config.h, config_gram.y, fileio.c, fileio.h, lexer.l, lists.c: + * lists.h, main.c, pgm.c, pgm.h, pindefs.h, ppi.c, ppi.h: + * stk500.c, stk500.h, term.c, term.h: + The last part of that last commit message should read: + + All others - modify program description. + + * Makefile, avr.c, avr.h, avrdude.1, avrpart.h, config.c: + * config.h, config_gram.y, fileio.c, fileio.h, lexer.l, lists.c: + * lists.h, main.c, pgm.c, pgm.h, pindefs.h, ppi.c, ppi.h: + * stk500.c, stk500.h, term.c, term.h: + Makefile: include a target to automatically generate the dependency + list. + + All others + +2003-02-06 Brian S. Dean + + * avrdude.1: Update license to GPL, permission by Joerg Wunsch. + + * lexer.l: Add GPL. + + * Makefile, config_gram.y: Add GPL to the Makefile and config_gram.y. + + * Makefile, stk500.h: + Add stk500.h as a dependency for stk500.c. Remove carraige returns + from stk500.h - don't know how those got in there (pointed out by Ted + Roth). + + * COPYING, avr.c, avr.h, avrpart.h, config.c, config.h, fileio.c: + * fileio.h, lists.c, lists.h, main.c, pgm.c, pgm.h, pindefs.h: + * ppi.c, ppi.h, stk500.c, stk500.h, term.c, term.h: + Re-license using the GNU GPL. Thanks to Ted Roth for the patch. + + * avr.c, avr.h, config.c, config.h, config_gram.y, fileio.c: + * fileio.h, lexer.l, lists.c, lists.h, main.c, pgm.c, pgm.h: + * pindefs.h, ppi.c, ppi.h, stk500.c, stk500.h, term.c, term.h: + Get rid of the verbose printing of individual file CVS version ids. + This was intended to be used for identifying code in the field for + incoming bug reports, but I've never really found it all that useful. + + * CHANGELOG, Makefile, Makefile.inc, avr.c, avrdude.1: + * avrdude.conf.sample, config_gram.y, lexer.l, main.c, stk500.c: + * term.c: + Change the name from AVRPROG to AVRDUDE. + + This change represents a name change only. There is currently an + effort to port AVRPROG to other platforms including Linux and Windows. + Since Atmel's programmer binary that's included within their AVR + Studio software is named AVRPROG.EXE on the Windows OS, there is the + chance for confusion if we keep calling this program AVRPROG as well. + Up until now the name hasn't really been a problem since there was no + chance to confuse 'avrprog' on Unix with Atmel's AVRPROG because + Atmel's tools only run on Windows. But with the Unix 'avrprog' + possibly being ported to Windows, I felt a name change was the best + way to avoid problems. + + So - from this point forward, my FreeBSD Unix program formerly + known as AVRPROG will subsequently be known as AVRDUDE (AVR + Downloader/UploaDEr). + + This change also represents a time when the AVRDUDE sources move from + my own private repository to a public repository. This will give + other developers a chance to port AVRDUDE to other platforms and + extend its functionality to support additional programming hardware, + etc. + + So goodbye AVRPROG, welcome AVRDUDE! diff --git a/xs/src/avrdude/ChangeLog-2004-2006 b/xs/src/avrdude/ChangeLog-2004-2006 new file mode 100644 index 000000000..20e5b2e8b --- /dev/null +++ b/xs/src/avrdude/ChangeLog-2004-2006 @@ -0,0 +1,1644 @@ +2006-12-23 Joerg Wunsch + + * configure.ac (AC_INIT): Bump version to 5.3cvs (again). + +2006-12-22 Joerg Wunsch + + * configure.ac (AC_INIT): Bump version to 5.3.1. + * avrdude.conf.in (frank-stk200): Fix syntax error. + * ser_avrdoper.c: Make #ifdef for Win32/libhid + consistent with the initial check: use the HID driver + only iff found, otherwise use libusb. + +2006-12-21 Joerg Wunsch + + * configure.ac (AC_INIT): Bump version to 5.3cvs. + +2006-12-21 Joerg Wunsch + + Released AVRDUDE 5.3. + +2006-12-21 Joerg Wunsch + + * configure.ac (AC_INIT): Bump version to 5.3. + +2006-12-21 Joerg Wunsch + + Submitted by Vince VG: + * avrdude.conf.in (frank-stk200): New programmer added. + * doc/avrdude.texi: Mention frank-stk200. + Closes patch #5502: one other programmer + +2006-12-21 Joerg Wunsch + + Submitted by Christian Starkjohann: + * ser_avrdoper.c (usbOpenDevice): clear the error code when + returning successfully. + +2006-12-21 Joerg Wunsch + + Submitted by Christian Starkjohann: + patch #5507: Support for AVR-Doper USB programmer in HID mode + * configure.ac: Add hooks to detect the Win32 HID library, + as well as the existence of . + * Makefile.am: Add new files. + * my_ddk_hidsdi.h: (New file.) + * ser_avrdoper.c: (New file.) + * serial.h: Add declaration for avrdoper_serdev. + * stk500v2.c: Add hook to divert to the AVR Doper code. + * avrdude.1: Document the AVR Doper support. + * doc/avrdude.texi: (Ditto.) + +2006-12-15 Joerg Wunsch + + Submitted by ivanv at netman.ru + * jtagmkI.c: fix length for single-byte write operations. + Closes bug #18527 JTAG ICE: fuse bits have been writen incorrectly + +2006-12-11 Joerg Wunsch + + * jtagmkII.c (jtagmkII_paged_write): Remove a debugging + usleep(1000000) that accidentally crept in in rev 1.19. + +2006-12-11 Joerg Wunsch + + * ser_posix.c (ser_open): Do fill in fdp->ifd before already + using it in ser_setspeed(). + +2006-12-11 Joerg Wunsch + + * jtagmkI.c (jtagmkI_close): revert baud rate to the initial + value in case we had changed it. + Fixes bug #18262: JTAGMKI/JTAG1 Reset Bug + +2006-12-11 Colin O'Flynn + + * safemode.c: Stop ignoring return values! + Closes bug #18339 + +2006-12-11 Joerg Wunsch + + Submitted by Nick Lott: + * avrdude.conf.in: Fix signature for ATmega8515. + Closes bug #18348: ATMEGA8515 Signature is wrong in avrdude.conf + +2006-12-11 Joerg Wunsch + + * avr.c: Fix a bug introduced in rev. 1.69, when implementing the + fallback from each programmer's paged_load() or paged_write() + method, respectively. The return value needs to be checked for + being greater or equal than 0 rather equal to 0 in order to + assume the operation has been successful. + Fixes bug #18489: avrdude is too slow (20 byte/s) + +2006-12-11 Joerg Wunsch + + * avr910.c: Make the code compile warning-free: + - declare a dummy "struct timezone" for some Win32 systems (MinGW) + - fix a few printf() argument types + - get rid off the prevailing "all filedescriptors are of type int" + attitude + The last item required a large sweep across the code, in order to + replace all "int fd"s by "struct filedescriptor *fd"s, and pass + pointers (as we cannot pass a union directly). In return, the + code is now supposed to be fully 64-bit safe, rather than relying + on a 64-bit pointer being converted to a (32-bit) int and back + to a pointer as we did previously. + * butterfly.c: (Ditto.) + * jtagmkI.c: (Ditto.) + * jtagmkII.c: (Ditto.) + * lists.c: (Ditto.) + * par.c: (Ditto.) + * pgm.h: (Ditto.) + * ppi.c: (Ditto.) + * ppi.h: (Ditto.) + * ppiwin.c: (Ditto.) + * ser_posix.c: (Ditto.) + * ser_win32.c: (Ditto.) + * serbb_posix.c: (Ditto.) + * serbb_win32.c: (Ditto.) + * serial.h: (Ditto.) + * stk500.c: (Ditto.) + * stk500v2.c: (Ditto.) + * usb_libusb.c: (Ditto.) + +2006-11-23 Joerg Wunsch + + Implement EEPROM access through debugWire. + * jtagmkII.c: Extend the jtagmkII_read_byte() and + jtagmkII_write_byte() methods to handle EEPROM through + debugWire. + * avrpart.h: Implement the "flash instruction" parameter. + * config_gram.y: (Ditto.) + * lexer.l: (Ditto.) + * avrdude.conf.in: (Ditto.) + * avrdude.1: Document the EEPROM access through dW. + * doc/avrdude.texi: (Ditto.) + * tools/get-dw-params.xsl: Extend to extract the flash + instruction field. + +2006-11-23 Joerg Wunsch + + * avr.c (avr_read, avr_write): if the paged access returns a + failure, fall back to byte access. + +2006-11-21 Joerg Wunsch + + * jtagmkII.c: In jtagmkII_read_byte() and jtagmkII_write_byte(), + return an error upon failure now that the upper layers won't fall + back to the cmd() method anymore in that case. + +2006-11-21 Joerg Wunsch + + Implement debugWire programming support. + * avrpart.h: Implement debugWire support. + * config_gram.y: (Ditto.) + * jtagmkII.c: (Ditto.) + * jtagmkII.h: (Ditto.) + * lexer.l: (Ditto.) + * avrdude.conf.in: Add the new dW programmers. + * avrdude.1: Document the dW support. + * doc/avrdude.texi: (Ditto.) + * tools/get-dw-params.xsl: XSL stylesheet to extract the dW + parameters from the XML files. + +2006-11-20 Joerg Wunsch + + * jtagmkI.c (jtagmkI_close): remove two unused variables. + +2006-11-20 Joerg Wunsch + + * avr.c: Replace the fallback of avr_read_byte() and avr_write_byte() to + avr_read_byte_default() and avr_write_byte_default (resp.) by directly + calling the latter functions from within all programmers that don't + implement their own read_byte()/write_byte() methods. In turn, make the + read_byte() and write_byte() methods mandatory, and the cmd() method + (direct ISP command) optional instead (it's effectively mandatory for + any programmer using avr_read_byte_default()/avr_write_byte_default() + though). Remove all the pointless cmd() method stubs from those programmers + that don't need it. + Eliminate avr_read_byte() as it was now completely identical to + pgm->read_byte(). + * avr.h: (Ditto.) + * bitbang.c: (Ditto.) + * butterfly.c: (Ditto.) + * jtagmkI.c: (Ditto.) + * jtagmkII.c: (Ditto.) + * par.c: (Ditto.) + * pgm.c: (Ditto.) + * safemode.c: (Ditto.) + * serbb_posix.c: (Ditto.) + * serbb_win32.c: (Ditto.) + * stk500.c: (Ditto.) + * stk500v2.c: (Ditto.) + * term.c: (Ditto.) + * usbasp.c: (Ditto.) + +2006-11-13 Joerg Wunsch + + * jtagmkI.c: Avoid sending a CMD_RESET when leaving programming + mode, and CMD_GO when closing the connection. They cause the + activity LED on the ICE to continue to flicker, and are not + necessary anyway (the target starts to run by itself when leaving + programmng mode). + This is a partial fix for bug #18262: JTAGMKI/JTAG1 Reset Bug + +2006-11-12 Colin O'Flunn + + * avrdude.conf.in: Add read command for lockbits for Tiny2313. + Applies patch #5538 + +2006-11-10 Joerg Wunsch + + * avrdude.conf.in: Add signatures for ATmega325/3250/645/6450. + +2006-11-08 Joerg Wunsch + + * configure.ac: Preserve ${LDFLAGS} inherited from environment + for Win32 environments. + +2006-11-07 Joerg Wunsch + + * configure.ac: Don't pretend --enable-doc were the default. + +2006-11-02 Joerg Wunsch + + * avrdude.conf.in: Fix the width of the efuse memory area for a + number of AVRs. + Closes bug #18182: Wrong setting of eFuse configuration for + mega640/1280/1281/2560/2561 in avrdude 5.2 + +2006-11-01 Joerg Wunsch + + * avrdude.conf.in: Implement HVSP and PP modes for the AVR Dragon. + * config_gram.y: (Ditto.) + * jtagmkII.c: (Ditto.) + * jtagmkII_private.h: (Ditto.) + * lexer.l: (Ditto.) + * stk500v2.c: (Ditto.) + * stk500v2.h: (Ditto.) + * avrdude.1: Document the HVSP and PP support for the Dragon. + * doc/avrdude.texi: (Ditto.) + +2006-10-27 Joerg Wunsch + + * jtagmkI.c: Implement a flags field in struct serdev, and populate it + with a flag that indicates whether the underlying communication can + dynamically change its speed or not. This flag is set for true serial + communication but clear for USB communication. Don't try to adjust + the speed when talking over a communication channel that doesn't + support it. (The Dragon does not even support the respective parameter.) + * jtagmkII.c: (Ditto.) + * ser_posix.c: (Ditto.) + * ser_win32.c: (Ditto.) + * serial.h: (Ditto.) + * usb_libusb.c: (Ditto.) + +2006-10-26 Joerg Wunsch + + * avrdude.conf.in: Add support for the AVR Dragon (JTAG and ISP mode). + * config_gram.y: (Ditto.) + * jtagmkII.c: (Ditto.) + * jtagmkII.h: (Ditto.) + * lexer.l: (Ditto.) + * stk500v2.c: (Ditto.) + * stk500v2.h: (Ditto.) + * usbdevs.h: (Ditto.) + * avrdude.1: Document the AVR Dragon support. + * doc/avrdude.texi: (Ditto.) + +2006-10-09 Joerg Wunsch + + Released AVRDUDE 5.2. + +2006-10-09 Joerg Wunsch + + * configure.ac: Bump version to 5.2 + +2006-10-09 Joerg Wunsch + + Submitted by John Voltz: add AVR053 oscillator calibration. + * main.c: Add the -O option. + * pgm.c: Add the hook for the perform_osccal() method. + * pgm.h: (Ditto.) + * stk500v2.c: Implement perform_osccal(). + * avrdude.1: Document the -O option. + * doc/avrdude.texi: (Ditto.) + Partially closes bug #17487: AVR RC oscillator calibration + routine not supported (feature request) + +2006-10-09 Joerg Wunsch + + Submitted by freckle@sf.net: + * stk500.c (stk500_paged_write): Send the command and the data + payload within a single write(). + patch #5025: Improve stk500.c robustness + + Submitted by Matthias Ringwald: + * stk500.c (stk500_open): do not flush the serial line after + getting in sync with the programmer. + patch #5293: stk500.c: no drain after sync (-> allow BTnode + Bootloader to work on cygwin) + +2006-09-29 Joerg Wunsch + + * pgm.h: Fix prototype for gettimeofday(). + Closes bug #17884: another gettimeofday conflict under win32/cygwin + +2006-09-24 Joerg Wunsch + + Submitted by Thomas Fischl (initially): + * configure.ac: Add the CoreFoundation and IOKit framework + linker flags on MacOS X when configuring for USB support. + patch #4685: Libusb on MacOS X: detection and additional includes + +2006-09-20 Joerg Wunsch + + * avr910.c: As there is a lot of ambiguity about the AVR910 + device codes, allow the user to override the device code + verification with the -F option. + * main.c: Make ovsigck a global variable. + +2006-09-20 Joerg Wunsch + + Add the "stk500generic" programmer that auto-probes for STK500 + either firmware version 1 or 2. + * Makefile.am (avrdude_SOURCES): add the new files + stk500generic.c and stk500generic.h. + * avrdude.conf.in: Add the stk500generic programmer type, and + change the "stk500" entry to point to this programmer. + * config_gram.y: Add the stk500generic keyword. + * lexer.l: (Ditto.) + * stk500.c: Change the stk500v1 code to not call exit() + prematurely when failing to open the programmer, but instead + return an error status. + * stk500generic.c: (New file.) Stub programmer implementation. + Probe for either stk500v1 or stk500v2, and adjust the current pgm + appropriately. + * stk500generic.h: (New file.) Declare the public interface(s) + of stk500generic.c. + * doc/avrdude.texi: Document the changed behaviour of stk500. + +2006-09-18 Joerg Wunsch + + * avrdude.conf.in: Various fixes for ancient processors and their + capabilities. For the AT90S1200 and the AT90S8515, fuse bit + handling via ISP, and lock bit reading via ISP are not supported + at all. For the AT90S4414 (small brother of the AT90S8515), add + the ability to write the lock bits, and add a definition for the + fuse bits (usable for HV programming). For the AT90S2313, add the + "fuse" memory range, so it's available for HV programming. + + Resolves bug #17796: avrdude will not program or verify lockbits + with Atmel STK protocol programmers + +2006-09-17 Joerg Wunsch + + Submitted by Thomas Fischl: + * usbasp.c: Check for USBasp with new as well as old VID/PID + pair, warn the user about upgrading the firmware in case an + old one has been found. + * usbasp.h: Add new VID/PID. + +2006-09-15 Joerg Wunsch + + * avrdude.conf.in: Fix some mistakes for the ATtinyX61 family: + . high fuse has 8 bits + . there is an extended fuse (just one bit) + . the calibration area is only 1 byte + +2006-09-12 Joerg Wunsch + + * doc/avrdude.texi: Convert some of the tables to multitables + in order to beautify the result. + +2006-09-10 Joerg Wunsch + + Contributed by Thomas Fischl: add support for USBasp. + patch #4686: Add support for USBasp, a simple USB programmer + * usbasp.c: New file, implement the USBasp driver. + * usbasp.h: New file, interface declarations for USBasp. + * Makefile.am: Wire the new files into the build. + * avrdude.conf.in: Add the usbasp programmer entry. + * config_gram.y: Add the usbasp token. + * lexer.l: (Ditto.) + * avrdude.1: Document the USBasp programmer. + * doc/avrdude.texi: (Ditto.) + +2006-09-08 Joerg Wunsch + + * main.c: Implement -U filename as a shorthand for + -U flash:w:filename:a. + * avrdude.1: Document this. + * doc/avrdude.texi: (Ditto.) + +2006-09-08 Joerg Wunsch + + Implement numerical output formats for decimal, hexadecimal, + octal, and binary numbers. + Closes bug #16129: more output formats for fuse bits + (avrdude enhancement request) + * fileio.c: Implement fileio_num() and the itoa_simple() + helper function. + * fileio.h: Add new file formats to FILEFMT. + * main.c: Parse the new file formats. + * avrdude.1: Document all this. + * doc/avrdude.texi: (Ditto.) + +2006-09-08 Joerg Wunsch + + * fileio.c: CPP statements start in column #1. + * stk500v2.c: Hide two debug/trace statements behind "verbose". + +2006-09-07 Joerg Wunsch + + * avrdude.1: Describe how to disable the DWEN fuse. + * doc/avrdude.texi: (Ditto.) + +2006-09-07 Joerg Wunsch + + * jtagmkII.c: Translate numerical response codes to strings. + +2006-09-07 Joerg Wunsch + + * avrdude.1: The avr109 programmer type no longer chokes on + a wrong avr910 device ID, so remove that description. + * doc/avrdude.texi: (Ditto.) + +2006-09-07 Joerg Wunsch + + * jtagmkII.c: When failing to start in ISP mode, try + debugWire instead. This requires the user to eventually + restart AVRDUE from scratch then. + +2006-09-06 Joerg Wunsch + + Add support for the JTAG ICE mkII in ISP mode. + * avrdude.conf.in (jtag2isp): New programmer entry. + * config_gram.y: Add K_JTAG_MKII_ISP. + * jtagmkII.c: Restructure and export some more functions. + * jtagmkII.h: Declare exported functions. + * jtagmkII_private.h: Prepare file to be included in stk500v2.c. + * lexer.l: Add jtagmkii_isp token. + * stk500v2.c: Implement glue to jtagmkII.c. + * stk500v2.h: Declare stk500v2_jtagmkII_initpgm(). + * avrdude.1: Document the new programmer support. + * doc/avrdude.texi: (Ditto.) + +2006-09-01 Joerg Wunsch + + * main.c: Add date and time of compilation to the verbose + greeting message. + Idea taken from patch #3172: Adds date and time of compile + to usage message + +2006-09-01 Joerg Wunsch + + Contributed by as + patch #4372: Better synchronization for stk500 + * stk500.c: Sync three times, and drop any noise inbetween. + +2006-09-01 Joerg Wunsch + + * avrdude.conf.in (ATtiny261, ATtiny461, ATtiny861): new + entries. + +2006-09-01 Joerg Wunsch + + * butterfly.c: Remove the device support decision based on + the old AVR910 device codes; we've got signature verification + now so better rely on that. + * avr910.c: Revert the signature bytes returned, as it already + happened in butterfly.c. This closes bug #14998: Signature Bytes + read in wrong order (avr910 mode) + +2006-09-01 Joerg Wunsch + + Submitted by Wim Lewis. + * serbb_posix.c: Improve error handling. + patch #4923: Better error reporting for serial-bitbang programmers + +2006-08-31 Joerg Wunsch + + * avrdude.conf.in: Introduce a "stk500v1" entry, so we + can switch the default "stk500" to "stk500v2" some day. + +2006-08-31 Joerg Wunsch + + The major part of this change has been contributed by + . + Implements patch #4635: Add support for terminal/console + servers for serial programmers + * ser_posix.c: Add net_open(), and divert to it for net:host:port. + * ser_win32.c: Recognize net:host:port, and bail out. + * avrdude.1: Document the net:host:port connection option. + * doc/avrdude.texi: (Ditto.) + +2006-08-31 Joerg Wunsch + + Fix for bug #16627: Butterfly programmer does not reset after + programming + * butterfly.c: Wait for the device's response after sending + an "E" command. + +2006-08-31 Joerg Wunsch + + Tentative fix for bug #16156: Problem with Si-Prog + * serbb_posix.c: Disable reset before closing. + * serbb_win32.c: (Ditto.) + +2006-08-30 Joerg Wunsch + + Rewrite the serbb code so the pin numbering matches the + DB9 connector, and fix some related bugs in serbb_posix.c. + Closes bug #16265: dasa2 does not work under posix + * avrdude.conf.in: New serbb pin numbering; added "siprog" + as an alias for "ponyser". + * serbb_posix.c: New pin numbering, fix some confusion. + * serbb_win32.c: New pin numbering. + The generic and Posix-related parts of these changes have + been contributed by Hanns-Konrad Unger + +2006-08-30 Joerg Wunsch + + Contributed by the anonymous developer of patch #5096: + * avrdude.conf.in (blaster): Add an entry for the Altera + byteblaster. + +2006-08-30 Joerg Wunsch + + Rework the exit specs so they actually work again. It should be + possible to extend them for other programmers than PPI now (serbb, + stk500*). + * pgm.h: Keep the exit specs in an abstract form inside struct + programmer_t. (Should be moved out into some programmer-specific + structure.) Rename the getexitspecs() method into + parseexitspecs(). + * main.c: Move the exit specs stuff out to the programmer + implementation. + * par.c: Implement the new exit spec handling. Everything is now + done using the generic abstraction layer. + Closes bug #16443: No disable Resetsignal at the end of + Programming Session + Obviates need for patch #5057: quick and dirty Hack to unset Reset + after Programming + +2006-08-29 Joerg Wunsch + + This patch has been contributed by an anonymous developer + via the patch tracking system. + patch #5096: Allow VCC and BUFF to be any pin in parallel mode + * config_gram.y: Release the restriction to PPIDATA pins. + * par.c: Rework the code to introduce a function par_setmany() + that builds on top of par_setpin(), and use that function for the + PPI_AVR_VCC and PPI_AVR_BUFF pin collections. This also abstracts + the polarity of these signals appropriately. + +2006-08-28 Joerg Wunsch + + Contributed by Ned Konz: + * ser_posix.c: Open the serial port with O_NONBLOCK, and + save and restore the port state before exiting. + patch #5008: Patch for (5.1) ser_posix.c for O_NONBLOCK open + and restoring serial port state on close + Closes bug #12622: avrdude hangs on macosx/darwin with PL-2303 + usb-to-serial and Butterfly + +2006-08-22 Joerg Wunsch + + * bitbang.c: Move the bitbang prerequisite checks out from + main() into their own bitbang_check_prerequisites(). + * bitbang.h: (Ditto.) + * main.c: (Ditto.) + * par.c: (Ditto.) + * serbb_posix.c: (Ditto.) + * serbb_win32.c: (Ditto.) + +2006-08-22 Joerg Wunsch + + * avrdude.conf.in: Add page mode parameters for all "eeprom" + memory definitions that are organized in pages. + * avr.c (avr_write_byte_default): Consider using the loadpage + instructions only if the respective memory is marked "paged". + Closes bug #17199: EEPROM fails verification on ATmega645 with + pony-stk200 hardware + Closes bug #16849: EEPROM write fails for AT90USB1287 with + mode 0x41 + Closes bug #15146: stk500v2_paged_write: loadpage instruction + not defined for part + +2006-08-22 Joerg Wunsch + + * doc/avrdude.info (-c): Change "avrispmk2" into "avrisp2" as that + is the programmer actually supported by avrdude.conf.in. + Closes bug #15677: documentation mentions wrong programmer-id + "avrispmk2" + +2006-08-21 Joerg Wunsch + + * avrdude.conf.in: Fix various AVR910 device codes. Add the code + tables from both, AVR910 and AVR109. Change avr910_devcode of + the ATtiny2313 to 0x5e (ATtiny26). + Closes bug #16671: Tiny2313 avr910_devcode is bad + Closes bug #15826: avr910 device type for ATmega8 wrong + +2006-08-21 Joerg Wunsch + + * avrdude.conf.in: Add (rather conservative) write delay timing + values to the *fuse and lock memory spaces of all devices where + they have been missing. Add the lock memory space to the ATmega48 + section. + Closes bug #14920: tiny2313 fuses and AVRDUDE 5.0 + Closes bug #15751: atmega48: no lock bits defined + +2006-08-21 Joerg Wunsch + + * avrdude.conf.in: Fix the size of the calibration memory space + for ATtiny13, ATmega64, ATmega16, ATmega32, ATmega8535, ATtiny25, + ATtiny45, ATtiny85. + Closes bug #17383: Wrong calibration section in avrdude.conf... + +2006-08-21 Joerg Wunsch + + * avrdude.conf.in (ATmega324): Correct the pagesize from 256 to + 128. + This closes bug #16410: ATMega164/324/644 cannot be programmed + +2006-08-20 Joerg Wunsch + + * configure.ac: Check for gettimeofday(). + * ppiwin.c (gettimeofday): Define gettimeofday() replacement + only if !defined(HAVE_GETTIMEOFDAY); use correct protype. + +2006-08-18 Joerg Wunsch + + * stk500v2: Minor cosmetic changes: STK500 firmware version + numbers are M.NN, so always display the minor number as two + digits. Examine the response to the sign-on command to see which + programmer hardware we are talking to, and then restrict the + STK500 topcard display to devices detected as STK500. + +2006-08-18 Joerg Wunsch + + * Makefile.am: Add a dist-hook, and make it remove lexer.c, + config_gram.c, and config_gram.h from the source distribution + archive. These files are supposed to be generated on the target + system. + Closes bug #15536: avrdude-5.1 compilation fails on Gentoo/amd64 + +2006-08-17 Joerg Wunsch + + * stk500v2.c: unreverse the argument order for + CMD_CHIP_ERASE_HVSP; Atmel says AVR068 is right, and + stk500.exe is wrong. + * configure.ac (AC_CHECK_LIB[usb]): Fix the generation + of HAVE_LIBUSB in ac_cfg.h. + +2006-08-17 Joerg Wunsch + + Submitted by Neil Davey: + patch #4539: Ability to control the bit clock (usleep) delay + for ppi interface + * bitbang.c: Implement bitbang_delay() and its calibration. + * bitbang.h: Declare bitbang_delay(). + * main.c: Add the ispdelay option (-i). + * pgm.h (struct programmer_t): Add the ispdelay parameter. + * par.c: Add calls to bitbang_delay() when requested. + * serbb_posix.c: (Ditto.) + * serbb_win32.c: (Ditto.) + * avrdude.1: Document the new -i option. + * doc/avrdude.texi: (Ditto.) + +2006-08-14 Joerg Wunsch + + Submitted by : + * avrdude.conf.in (ATmega48, ATmega88, ATmega168): patch #5100: + mega88 EEPROM support (extended for ATmega48 and ATmega168 - jw). + +2006-08-14 Joerg Wunsch + + Submitted by : + * stk500v2.c (stk500v2_open): patch #5273: Emit error message + if user requests usb and no libusb support + +2006-08-14 Joerg Wunsch + + * avrdude.conf.in: Add HVSP/PP mode parameters for all AVRs. + +2006-08-13 Joerg Wunsch + + * tools: New directory. + * tools/get-hv-params.xsl: New file, extract high-voltage + programming parameters from Atmel XML files, and produce + an avrdude.conf[.in] snippet. + +2006-08-11 Joerg Wunsch + + * configure.ac (AC_CHECK_LIB([usb]): implement a private LIBUSB + macro to add this library to, to prevent it from being + automatically linked to all binaries. This should fix the Win32 + build of loaddrv. + * Makefile.am (avrdude_LDADD): add LIBUSB here. + +2006-08-10 Eric B. Weddington + + Contributed by Bob Paddock + * avrdude.conf.in: Patch #4780. Provide support for mega325, + mega3250, mega645, mega6450. + +2006-08-10 Joerg Wunsch + + * avrdude.conf.in (ATtiny11): fix the HVSP control stack, + add delay values required for flash and EEPROM. + * stk500v2.c: reverse the argument order for + CMD_CHIP_ERASE_HVSP; AVR068 and stk500.exe differ here. + +2006-08-09 Joerg Wunsch + + * stk500v2.c (stk500v2_program_enable): Fix a typo + (synchloops vs. synchcycles). + +2006-08-04 Joerg Wunsch + + * avrdude.conf.in: Add parallel programming definitions for + the ATmega8/48/88/168. + +2006-07-22 Joerg Wunsch + + * avrdude.conf.in: Add the ATtiny11, an HVSP-only device. + +2006-07-21 Joerg Wunsch + + Implement STK500 (v2) HVSP mode. + * stk500v2.c: Add new functions for HVSP support. + * stk500v2.h: Add prototype for the stk500hvsp programmer. + * avrpart.h: Add fields to struct avrpart for new features. + * config_gram.y: Extend the configuration syntax for new + features required for HVSP support. + * lexer.l: (Ditto.) + * avrdude.conf.in: Add HVSP support for ATtiny13 and + ATtiny45 as an example. + * avrdude.1: Document stk500hvsp. + * doc/avrdude.texi: (Ditto.) + +2006-07-21 Joerg Wunsch + + * avrpart.c: Print the very verbose memory details only + in debug level > 4. + +2006-07-19 Joerg Wunsch + + * stk500v2.c: Add more parameters for PP mode. Fix the + non-paged write operations for old AVRs. + * lexer.l: Add more parameters for PP mode. + * config_gram.y: (Ditto.) + * avrpart.h: (Ditto.) + * avrdude.conf.in: Use the new PP mode parameters; add PP mode + definitions for AT90S8515. + * avrdude.1: Document the stk500pp support. + * doc/avrdude.texi: (Ditto.) + +2006-07-19 Joerg Wunsch + + * stk500v2.c: Hide stk500v2_set_sck_period_mk2() behind an #if + defined(HAVE_LIBUSB) as it is only used there (for the AVRISP + mkII). + +2006-07-17 Joerg Wunsch + + * stk500v2.c: Fix all bugs in stk500pp. Eliminate pagebuf, and + use a stack-allocated buffer instead, as the pagesize can be at + most 256 for all current AVRs anyway. + +2006-07-17 Joerg Wunsch + + * main.c: Use mem->desc in place of upd->memtype in more places to + give the full name of the respective memory area, instead of + the (possibly abbreviated) name the user typed in the -U option. + +2006-07-16 Joerg Wunsch + + First stab at an implementation of the STK500 parallel programming + feature (v2 firmware only), named "stk500pp". Still not yet + complete: EEPROM writes not working, documentation missing, only + ATmega16 parameters available in avrdude.conf.in, some parameters + not yet implemented. + * avrdude.conf.in: Add sample parameters for PP mode to ATmega16. + * avrpart.h: Add the parallel programming control parameters. + * avrpart.c: (Ditto.) + * config_gram.y: Add stk500pp configuration grammar. + * lexer.l: Add stk500pp token recognition. + * stk500v2.h: Add declaration for stk500pp_initpgm(). + * stk500v2.c: Add stk500pp implementation. + +2006-07-11 Joerg Wunsch + + * avrdude.conf.in: Fix the signatures for the + ATmega164/324 devices. + +2006-07-10 Joerg Wunsch + + * avrdude.conf.in: Enter the signatures for the + ATmega164/324/644 devices. + +2006-05-25 Joerg Wunsch + + * stk500v2.c: Implement extended addressing needed + for the ATmega256x devices. + * avrdude.1: Document ATmega256x support. + * doc/avrdude.texi: Document ATmega256x support. + Also document Solaris port defaults. + +2006-05-24 Joerg Wunsch + + * avr.c: Start implementing support for ATmega256x; + jtag2 and bitbang programmers are working, stk500v2 + still needs to be done. + * avrdude.conf.in: (Ditto.) + * avrpart.c: (Ditto.) + * avrpart.h: (Ditto.) + * config_gram.y: (Ditto.) + * lexer.l: (Ditto.) + +2006-04-18 Joerg Wunsch + + Contributed by Julius Luukko : + * avrdude.conf.in: Add the "ere-isp-avr" programmer. + +2006-04-13 Joerg Wunsch + + * par.c: Add logic to negate parallel-port signals in + avrdude.conf using a tilde. + + Contributed by Bram Daams: + * avrdude.conf.in: Add the "atisp" programmer entry that + makes use of negated signals. + +2006-03-28 Joerg Wunsch + + * avrdude.conf.in: Add entries for AT90USB{64,128}{6,7} + +2006-03-23 Colin O'Flynn + + Contributed by Wim Lewis, fix a few typos (patch #4987) + * avrdude.1: Typo fix + +2006-02-27 Colin O'Flynn + + Contributed by Wim Lewis, add support for checking device + signatures in detail (patch #4924 and #4925) + * avrdude.conf.in: Add signatures + * avrpart.c: Set default signature + * avrpart.h: Variable for signature + * config_gram.y: More signature reading + * lexer.l: Define that signatures exist + * main.c: Read signatures and check them against hardware + +2006-02-21 Joerg Wunsch + + * avrdude.conf.in: Fix paged flash write for AT90PWMx + (error in datasheet). + +2006-01-23 Joerg Wunsch + + * configure.in: Bump version. + +2006-01-17 Colin O'Flynn + + * main.c: Fixed a typo in safemode variable names, fixed bug 15113 + * avrdude.conf.in : Added BS2 and pagel to M162, Patch 4766 + * main.c, stk500v2.c: Added patch 4804 from eolson@mit.edu + Which stops sck from being writtend needlessly + +2006-01-13 Joerg Wunsch + + Contributed by David Moore: add support for the + AVRISP mkII device. (Savannah patch #4789.) + * serial.h: Declare usb_serdev_frame device descriptor. + * stk500v2.c: Implementation of the AVRISP mkII handling. + * usb_libusb.c: Add USB handling for short-frame delimited + AVRISP mkII USB protocol; add distinction of different + devices in usbdev_open(). + * jtagmkII.c: Tell usbdev_open() to search for the JTAG ICE mkII. + * usbdevs.h: (New file.) + * Makefile.am: Add usbdevs.h, as well as some other forgotten + files "make distcheck" complained about. + * avrdude.conf.in: Add more aliases for the AVRISP mkII. + * avrdude.1: Document how to use the AVRISP mkII. + * doc/avrdude.texi: (Ditto.) + +2006-01-12 Joerg Wunsch + + * avrdude.conf.in: Add EEPROM page instructions for the + ATmega169 so it will work for STK500v2. + +2005-12-16 Joerg Wunsch + + * avrdude.conf.in: Added support for ATtiny24/44/84. + +2005-12-05 Colin O'Flynn + + * avrdude.conf.in: Added m162 support for stk500v2 + +2005-12-01 Joerg Wunsch + + * avrdude.conf.in: fix the number of significant bits for + the efuse memory in ATmega48/88/168; the datasheet is a bit + off here as well. + +2005-11-29 Joerg Wunsch + + * avrdude.1: update for JTAG ICE mkI support. + * doc/avrdude.texi: (Ditto.) + +2005-11-29 Joerg Wunsch + + Submitted by Galen Seitz: + patch #4459: Fix for rpm package builds + * avrdude.spec.in: update the RPM spec file: + - Default to enable-doc=yes during configure. + - Move info file to docs package. + - Make building of docs package conditional. Basic + idea copied from avr-gcc. + +2005-11-29 Joerg Wunsch + + Submitted by someone who thinks he's called "Daper": + Fix bug #15013: Wrong use of PPICLAIM (kernel: ppdev0: claim the + port first) + * par.c: don't claim/release here (thus win_ppdev.h not needed + anymore) + * ppi.c: claim/release here. + * freebsd_ppi.h: ppi_claim/ppi_release now take an fd as parameter. + * solaris_ecpp.h: (Ditto.) + * linux_ppdev.h: (Ditto.) (Also add copyright.) + * win_ppdev.h: Not needed anymore, remove. + +2005-11-28 Joerg Wunsch + + * jtagmkI.c: Improve the communication startup with the ICE. + +2005-11-28 Joerg Wunsch + + * configure.ac: enable parport access on x86_64 Linux and + FreeBSD systems. + +2005-11-27 Joerg Wunsch + + * avrdude.conf.in: add the "calibration" space to ATmega16. + +2005-11-25 Colin O'Flynn + + Fixed bug 15051, building for Windows breaks. + * par.c: ppi_claim and ppi_release definitions now in a Windows header file + * ppi.c: Only included if you are building for Windows + * win_ppdev.h: Initial Commit, see par.c + +2005-11-24 Joerg Wunsch + + Add basic support for the Atmel JTAG ICE mkI: + * config_gram.y: add mkI support to config sytax. + * lexer.l: (Ditto.) + * avrdude.conf.in: add sample programmer entries. + * jtagmkI.c: New file + * jtagmkI.h: New file + * jtagmkI_private.h: New file + * Makefile.am: include new files in build. + +2005-11-24 Colin O'Flynn + + Fix bug 14681 - Serial Communication Fails on -vvvv with Windows + * ser_win32.c: Patched with Brian Dean's patch + +2005-11-05 Colin O'Flynn + + Patch #4532 by Manfred Bartz + * avrdude.conf.in: added support for ATMega168 (also added support + for the stk500v2 protocol which was not in the patch). + +2005-11-03 Joerg Wunsch + + Add ecpp(7D) (parallel port) for Solaris. + * configure.ac: add Solaris' default parallel port. + * linux_ppdev.h: change parallel port access to the new style. + * freebsd_ppi.h: New file, abstract FreeBSD's ppi(4). + * solaris_ecpp.h: New file, abstract Solaris' ecpp(7D). + * par.c: change header inclusion sequence. + * pgm.h: remove obsolete ppi_claim() and ppi_release() dummies. + * ppi.c: change header inclusion sequence, use new parport + abstraction, drop obsolete dummy implementation. + +2005-11-02 Joerg Wunsch + + * config.h: change YYSTYPE to be a single word, to work around + a bug in Solaris' yacc. + * lexer.l: remove incompatibilities with Solaris' default lex, + bump resource limits for lex. + +2005-11-01 Joerg Wunsch + + Make avrdude Solaris-compatible. + * Makefile.am: distclean avrdude.conf. + * avrdude.conf.in: make the parallel-port programmers optional. + * bitbang.c: move the bitbang features out into PROGRAMMER. + * configure.ac: introduce --enable-parport, add Solaris. + * lexer.l: replace str by strng to work around problems in some + versions of flex. + * main.c: move getexitspecs into the respective programmer's + domain; replace rindex by the C-standard strrchr. + * par.c: make parallel port optional. + * par.h: everything but par_initpgm() is private now. + * pgm.h: add setping/getping/highpulsepin/getexitspecs. + * serbb_posix.c: generalize bitbang interface; replace + cfmakeraw() by explicit code. + * serbb_win32.c: generalize bitbang interface. + +2005-10-20 Joerg Wunsch + + * butterfly.c: fix yet another sign extension bug. + +2005-10-14 Joerg Wunsch + + * avrdude.conf.in (ATmega8515): fix size of calibration + memory. + +2005-10-09 Joerg Wunsch + + * avrdude.conf.in: add support for ATmega640/1280/1281. + * avrdude.1: document the above. + * doc/avrdude.texi: (Ditto.) + +2005-09-27 Joerg Wunsch + + * doc/avrdude.texi: Polish up the docs a bit. Use smallexample + instead of example for wide tty output. Document a trick to + find out about the serial numbers of all JTAG ICEs attached + to USB. + +2005-09-26 Joerg Wunsch + + * jtagmkII.c (jtagmkII_paged_write): default the page size early so the + buffer will be allocated correctly. + * usb_libusb.c: fix libusb handling; now it works with libusb-win32 as + well. + +2005-09-21 Joerg Wunsch + + * main.c(do_op): use mem->desc in place of upd->memtype to + give the full name of the respective memory area, instead of + the (possibly abbreviated) name the user typed in the -U option. + +2005-09-21 Joerg Wunsch + + * main.c: Add the forgotten -B option to the option string in + getopt(); sort the -s option into order. + +2005/09/21 Brian S. Dean + + * avr.c: + * main.c: + * safemode.c: + * safemode.h: + * term.h: + This is Colin O'Flynn's mega patch for updating safemode support: + + * add support for parts with just 'fuse' memory + + * if any fuse memories are altered, reflect those changes in the + post-programming safemode check so that safemode no longer + complains about fuses which were intentionally altered; this + eliminates the need to completely disable safemode using -u in + order to program fuses. + + * provide -s option which will not ask to restore fuses, it will + just do it + +2005-09-19 Joerg Wunsch + + * butterfly.c (butterfly_initialize): make the device code unsigned so + it wouldn't sign-extend when >= 0x80. + +2005-09-18 Joerg Wunsch + + Add the serial bit-bang driver, contributed by Michael Holzt. + * bitbang.h: New file. + * bitbang.c: New file. + * serbb.h: New file. + * serbb_posix.c: New file. + * serbb_win32.c: New file. + * Makefile.am: Include new files. + * config_gram.y: Add serbb to configuration language. + * lexer.l: (Ditto.) + * par.c: Centralize bit-bang code in bitbang.c. + * par.h: Declare newly published functions. + * pgm.h (struct programmer_t): Add a flag field for private use + by the programmer. + * pindefs.h: Add definitions for negated serbb pins. + * avrdude.conf.in: Add serbb programmers ponyser, dasa, and dasa3. + * avrdude.1: Document serbb code. + * doc/avrdude.texi: (Ditto.) + +2005/09/18 Brian S. Dean + + * avrdude.conf.in: Patch #4078: add VCC pin definition for DAPA + programmer. + +2005/09/18 Brian S. Dean + + * avr910.c: This is patch #3277 which appears to fix a number of + issues with the avr910 programmer. + + Fixes the following problems with paged writes in avr910.c: + - failure to re-set address after page writes; + - no polling or delay after page writes; + - no page writes when not using auto-increment; + - an extraneous page write when data ends on page boundary. + +2005-09-17 Joerg Wunsch + + * avrdude.conf.in: Fix the poll values for the ATmega103's EEPROM + so they eventually match the XML file. + This fixes bug #7492: EEPROM writing fail on atmega103 with + atavrisp + +2005-09-17 Joerg Wunsch + + * avrdude.conf.in: The ATmega128 has four oscillator calibration + bytes, not only a single one. + This closes bug #11496: Memory bank calibration on atmega128 + should have 4 bytes + +2005/09/17 Brian S. Dean + + * avrdude.1: + Document -q -q. Expand a little on the description of the 'part' + command. + +2005/09/16 Brian S. Dean + + * fileio.c: + * main.c: + Implement -q -q to be very very quiet. + +2005/09/16 Brian S. Dean + + * avrdude.conf.in: + Add DAPA programmer. + +2005/09/16 Brian S. Dean + + * avrdude.conf.in: + * stk500v2.c: + This fixes EEPROM access using the STK500V2 programmer, partially + undoing part of a previous general fixup commit. Choose the correct + read/write operations with the stk500v2 program function - the correct + one depends on the memory type. EEPROM is byte addressable so uses + read/write. FLASH is word addressable and so uses read_lo/write_lo. + +2005-09-16 Joerg Wunsch + + * avrdude.1: document the memtypes for -U + * doc/avrdude.texi: (Ditto.) + Closes bug #13501: should be listed in the man page + +2005-09-16 Joerg Wunsch + + * doc/Makefile.am: add logic to detect the misf^H^H^H^H + gratitous API change in recent versions of texi2html where + the output directory has changed names. + Fix for: + bug #13026: The build fails with texi2html 1.76 + bug #12715: make issues during install + patch #3091: commandline fix for latest version of texi2html + +2005-09-16 Joerg Wunsch + + * usb_libusb.c (usbdev_drain): actually implement draining to aid + synchronizing against a JTAG ICE in weird state. + +2005-09-16 Joerg Wunsch + + * butterfly.c: improve the butterfly initialization so it is more likely + to synchonize; [bug #9787: avrdude 4.4.0 correct butterfly interface] + +2005-09-14 Joerg Wunsch + + * jtagmkII.c (jtagmkII_paged_load): return the number of bytes read. + This makes EEPROM block reads work again. + +2005-09-14 Joerg Wunsch + + * avrdude.conf.in: add a jtag2slow programmer alias, and make + "jtag2" default to 115200 Bd. + * doc/avrdude.texi: document the above changes. + +2005/09/14 Brian S. Dean + + * avrdude.conf.in: + Change bit 0 of the ATmega169 efuse 'write' opcode from 'x' (ignore) + to 'i' (input). Even though this bit should be ignored, it should not + be changed. The 'x' setting sets the bit to zero which programs it + and could cause undefined behaviour. Setting to 'i' enables it to be + rewritten to its old value. + + A better solution might be to read the fuse byte, apply the new value + while leaving the 'x' bit alone, then writing the value back. The + current fix is a workaround which allows the developer to change the + bit as desired. + +2005-08-30 Joerg Wunsch + + * usb_libusb.c: Consistently use unsigned char for buffers. + +2005-08-29 Brian S. Dean + + * avr910.c: Eliminate compiler warnings. GCC 4.x elicits many + signedness warnings when passing unsigned char * when char * is in + the prototype and vice versa. Clean these up along with a few + others. + * butterfly.c: (Ditto.) + * jtagmkII.c: (Ditto.) + * safemode.c: (Ditto.) + * safemode.h: (Ditto.) + * ser_posix.c: (Ditto.) + * serial.h: (Ditto.) + * stk500.c: (Ditto.) + * stk500v2.c: (Ditto.) + +2005-08-28 Joerg Wunsch + + * avrdude.conf.in: Add support for the ATtiny25/45/85. Note that + only the ATtiny45 appears to have a complete XML description right + now. + * avrdude.1: Mention all the recently added device support: AT90PWM2/3, + ATmega164/324/644, ATmega329x/649x, ATtiny25/45/85. + * doc/avrdude.texi: (Ditto.) + +2005/08/28 Brian S. Dean + + * avrdude.conf.in: + * stk500v2.c: + This is patch # 4338, obsoletes patch #4327, provides fixes for bugs + #13693, #13871, and #14212. + + This provides bug fixes to the STK500V2 programmer type. + + - incorrect token used from avrdude.conf.in + - wrong command sent to programmer, hence no write to eeprom. + - programmer was said to start writing at 0x0000 and continue + page by page and was not repositionned when a gap was found + in the hex file, or when the hex file start address was not + 0x0000. Hence the verify procedure was correct, not the + write procedure. + - speed up of flash write to skip empty pages (full of 0xFF) + by re-enabling a dedicated function for that task. + - stk500v2_paged_load() was not returning the number of byte + read, so empty hex files were generated when reading memory. + +2005-08-17 Joerg Wunsch + + * avrdude.conf.in: fix the EEPROM size for ATmega329x/649x. + +2005-08-16 Joerg Wunsch + + * avrdude.conf.in: Add support for the AT90PWM2/3. + +2005-07-27 Joerg Wunsch + + (This work has been done as part of a contract with Atmel, Dresden.) + * butterfly.c: Implement full support for AVR109 boot loaders. + * avrdude.conf.in: add avr109 and avr911 as alias for butterfly. + * avrdude.1: Document the AVR109 addition. + * doc/avrdude.texi: (Ditto.) + +2005-07-26 Brian S. Dean + + * main.c: + Don't call exit() directly here - set the exit value and jump to the + main_exit: label to ensure the programmer is released correctly. + + * stk500v2.c: + The stk500v2_getsync() function was improperly checking for success, + thus it was falsely reporting that it failed when it was actually + working correctly. Fixed. + +2005-07-25 Joerg Wunsch + + * usb_libusb.c: Catch benign errors when reading the serial #. + +2005-06-19 Joerg Wunsch + + * Makefile.am: Implement libusb-base USB transport for the + JTAG ICE mkII. + * configure.ac: ditto. + * jtagmkII.c: ditto. + * ser_posix.c: ditto. + * ser_win32.c: ditto. + * serial.h: ditto. + * usb_libusb.c: ditto (New file). + * avrdude.1: document the USB transport. + * doc/avrdude.texi: ditto. + +2005-06-15 Joerg Wunsch + + * avrdude.conf.in: The AT90CAN128 has AllowFullPageBitstream = no. + +2005-06-14 Joerg Wunsch + + * avrdude.conf.in: Add support for the ATmega164/324/644. + * jtagmkII.c: If enter_progmode fails with RSP_ILLEGAL_JTAG_ID, give + the user a hint that the JTAGEN fuse might be unset. + +2005-06-11 Joerg Wunsch + + * avrdude.conf.in: Add support for the ATmega329x/649x. + +2005-05-27 Joerg Wunsch + + * jtagmkII.c: fix a signedness bug when shifting bits; when + discarding a packet for being overly long, restart the state + machine instead of attempting to drop a preposterous amount + of data. + +2005-05-19 Joerg Wunsch + + * avrdude.1: + * doc/avrdude.texi: Document that the JTAG ICE mkII code currently + cannot write to flash one byte at a time. Also mention the bug + tracker interface on savannah. + +2005/05/14 Brian S. Dean + + * configure.ac: + * main.c: + Update version for beta release and copyright message. + Change the default port to 'serial' for the newly added serial + programmers stk500v2 and jtagmkii. + +2005-05-10 Joerg Wunsch + + * Makefile.am: + * avr910.c: + * avrdude.1: + * avrdude.conf.in: + * avrpart.c: + * avrpart.h: + * butterfly.c: + * config_gram.y: + * crc16.c: + * crc16.h: + * jtagmkII.c: + * jtagmkII.h: + * jtagmkII_private.h: + * lexer.l: + * main.c: + * pgm.h: + * serial.h: + * ser_posix.c: + * ser_win32.c: + * stk500.c: + * stk500v2.c: + * stk500v2.h: + * stk500v2_private.h: + * doc/avrdude.texi: + + Mega-commit to bring in both, the STK500v2 support from Erik + Walthinsen, as well as JTAG ICE mkII support (by me). + + Note that for the JTAG ICE, I did change a few things in the + internal API. Notably I made the serial receive timeout + configurable by the backends via an exported variable (done in + both the Posix and the Win32 implementation), and I made the + serial_recv() function return a -1 instead of bailing out with + exit(1) upon encountering a receive timeout (currently only done + in the Posix implementation). Both measures together allow me to + receive a datastreem from the ICE at 115 kbps on a somewhat lossy + PCI multi-UART card that occasionally drops a character. The JTAG + ICE mkII protocol has enough of safety layers to allow recovering + from these events, but the previous code wasn't prepared for any + kind of recovery. The Win32 change for this still has to be done. + +2005/02/11 Brian S. Dean + + * main.c: + Exit non-zero if safe-mode reverts fuse bits that were requested on + the command-line. + + Variable declarations must only appear at the beginning of a block. + +2005/02/10 Brian S. Dean + + * avrdude.1: + Document -u option to disable safe mode. + +2005/02/10 Brian S. Dean + + * configure.ac: + doc/Makefile is now dependent on whether or not doc is enabled. + +2005/02/10 Brian S. Dean + + * Makefile.am: + * configure.ac: + Disable the doc build by default; the tools needed to build + doc are either not available on all systems or are at best + inconvenient to build and install. The doc can still be built, one + just needs to specify --enable-doc at configure time. + +2005-01-24 Colin O'Flynn + + * main.c: Add "safe mode". Fuse settings will be restored at the end + of a programming session unless the -u switch is specified. + * safemode.c: New file. Safe mode support. + * safemode.h: New file. Safe mode support. + * Makefile.am: Add new files. + * doc/avrdude.texi: Document new Safe Mode feature and switch. + +2004/12/22 Brian S. Dean + + * avrdude.conf.in: + Add support for "Xilinx JTAG cable". Contributed by: + Tymm + + Add support for the AT90CAN128. Not sure if all the instruction + encoding is correct, specifically the address bits don't exactly match + those of the preliminary datasheet that I have, but I don't see how + they could be right. Tested with STK500 and it works there. + Instruction encodings have not been tested due to lack of a parallel + port on my Mac development box. + +2004-07-19 Theodore A. Roth + + * avrdude.1: Remove reference to ppi programmer schematic. + * configure.ac (AC_INIT): Set version to "4.4.0cvs". + +2004-07-18 Theodore A. Roth + + * AVRDUDE 4.4.0 has been released (cvs release tag is "release_4_4_0"). + +2004-07-18 Theodore A. Roth + + * Makefile.am (EXTRA_DIST): Remove avrdude.pdf since it is no longer + supplied. + * NEWS: Fix typo. + * bootstrap: Delete the autom4te.cache dir before running the + autotools. + * configure.ac (AC_INIT): Set version to 4.4.0. + +2004-07-17 Jan-Hinnerk Reichert + + * avrdude.1: Fixed obvious copy and paste error + (Patch #3199 contributed by Galen Seitz) + +2004-07-15 Theodore A. Roth + + * main.c (main): Don't indent CPP directives. + When showing update progress in a no tty situation, use unbuffered IO + for all systems, not just win32 native. + Update copyright year when printing version. + Remove warning about native win32 being experimental. + Split a line string. + * ppiwin.c: Update copyright year. + Add cvs Id keyword. + (usleep): Cleanup debug CPP directives to improve readability. + * ser_win32.c: Include to fix failing build. + +2004-07-08 Theodore A. Roth + + * AUTHORS: Add names of recent major contributors. + * ser_win32.c: Assign copyright to Martin J. Thomas since he did all + real work on this file. + +2004-07-07 Jan-Hinnerk Reichert + + * NEWS, doc/TODO: Updated NEWS and TODO + +2004-07-07 Jan-Hinnerk Reichert + + * stk500.c, term.c, doc/avrdude.texi, avrdude.1: + added "sck"-command to the terminal mode. + This command allows slowing down of the SCK of + STK500-programmers. + +2004-07-05 Jan-Hinnerk Reichert + + * *.c, *.h: Removed unnecessary includes of + config.h + +2004-07-04 Jan-Hinnerk Reichert + + * avr.h: Removed some unused prototypes + +2004-07-04 Jan-Hinnerk Reichert + + * stk500.c: Fixed fosc behaviour for values exceeding + maximum frequency (contributed by Galen Seitz) + +2004-07-04 Jan-Hinnerk Reichert + * avrdude.conf.in: Added support for + ATtiny2313 (contributed by Bob Paddock) + +2004-06-25 Joerg Wunsch + + * avrdude.conf.in: Fix efuse bits for ATmega169. + +2004-06-24 Alex Shepherd + + Merged in Win32 Native changes contributed by Martin Thomas + Changed all instances of __CYGWIN__ conditional compilation to + WIN32NATIVE + + * ser_win32.c: fleshed out all the previous stubs + * ser_posix.c: added WIN32NATIVE conditional compilation to skip + all function to allow ser_win32.c functions to operate + * ppi.h: removed commented code + * pgh.h: added usleep macros + * main.c: stdout,stderr tweaks for Win32 + * configure.ac: added CFLAGS and LDFLAGS for Win32Native + * config_gram.y: added strtok_r macro + * buterfly.c: added various stub functions and EXIT processing + * avr910.c: added return 0 to avr910_open() and included time headers + * term.c: added warning about libreadline not supported in WIN32NATIVE + +2004-06-17 Jan-Hinnerk Reichert + + * avrdude.conf.in: Added support for + - tiny13 (contributed by Pawel Moll) + - mega48 and mega88 (contributed by Galen Seitz) + However, the STK500-code for mega8 remains unchanged. + +2004-05-19 Brian S. Dean + + * main.c: + * stk500.c: Allow the baud rate to be specified on the command + line with a new -b switch. The specified baud rate will + override the default serial port baud rate for a particular + programmer. + +2004-05-19 Brian S. Dean + + * ppi.c: Stub-out the ppi_* functions in ppi.c with empty + wrappers that simply return an error code in order to build + successfully on MacOS X. This allows avrdude to work on MacOS + X and was tested using a USB<->RS232 cable adapter, + specifically Keyspan model USA-19HS. + +2004-04-23 Joerg Wunsch + + * lists.h, lists.c: Drop LISTSZ and the check for + it in lcreat(). + +2004-04-17 Jan-Hinnerk Reichert + + * avr910.c: Hopefully fixed that weird "first byte not + programmed"-error in a good way (previous fix was not + working with all firmwares) + +2004-02-10 Jan-Hinnerk Reichert + + * avrdude.1, doc/avrdude.texi, doc/TODO: + Removed the deprecated options from documentation + +2004-02-10 Jan-Hinnerk Reichert + + * main.c: Removed deprecated options. + +2004-01-28 Jan-Hinnerk Reichert + + * pgm.c, main.c, avr910.c, butterfly.c, stk500.c: + Changed default for powerup, powerdown and LED-commands + to do nothing and return OK. Then removed these commands + from avr910, butterfly and stk500. + * pgm.c: Fixed wrong type for default_open introduced by + the cleanup yesterday. + +2004-01-29 Jan-Hinnerk Reichert + + * par.c: changed order of port-read/writes in par_txrx(). + This change should increase immunity to delays in the + programmer-hardware. + Also did some unrelated cleanup in par_txrx(). + +2004-01-28 Jan-Hinnerk Reichert + + * pgm.[ch], main.c, par.c, avr910.c, butterfly.c, stk500.c: + Move save/restore-functionality into open/close. + * par.c: open/close now saves/restores PPICTRL, too. + * TODO: exitspecs don't work if RESET is in PPICTRL. + +2004-01-26 Theodore A. Roth + + * configure.ac (AC_INIT): Post release version update. + +2004-01-26 Theodore A. Roth + + * AVRDUDE 4.3.0 has been released (cvs release tag is "release_4_3_0"). + +2004-01-26 Theodore A. Roth + + * configure.ac: Update copyright year. + (AC_INIT): Set version to 4.3.0. + +2004-01-25 Theodore A. Roth + + * ChangeLog: Minor formatting cleanups. + Move to all 2003 entries to ChangeLog-2003. + * ChangeLog-2003: New file. + * Makefile.am: Update copyright year. + (EXTRA_DIST): Add ChangeLog-2003. + +2004-01-17 Jan-Hinnerk Reichert + + * doc/avrdude.texi: Get rid of those black boxes marking "overfull + hbox". + +2004-01-17 Jan-Hinnerk Reichert + + * doc/avrdude.texi: New appendix "Troubleshooting". + +2004-01-12 Jan-Hinnerk Reichert + + * avr910.c, avrpart.c, avrpart.h, doc/TODO: + Look up devicecode and report device. + +2004-01-03 Jan-Hinnerk Reichert + + * avr910.c, pgm.c, pgm.h, config_gram.y, lexer.l: Add new configuration + parameter baudrate to support avr910-programmers with non-standard + baudrates. + * avrdude.conf.in, doc/avrdude.texi: Added "baudrate" to documentation. + +2004-01-03 Jan-Hinnerk Reichert + + * avr910.c: Removed debugging stuff that is no longer needed. + +2004-01-03 Jan-Hinnerk Reichert + + * doc/TODO: Removed two items. + +2004-01-03 Jan-Hinnerk Reichert + + * main.c, avr.c, avr.h, par.c, stk500.c: Add function + avr_chip_erase() to unify handling of cycle-count. + Makes cycle-count work for avr910-programmers. + diff --git a/xs/src/avrdude/ChangeLog-2007 b/xs/src/avrdude/ChangeLog-2007 new file mode 100644 index 000000000..3514da7e0 --- /dev/null +++ b/xs/src/avrdude/ChangeLog-2007 @@ -0,0 +1,364 @@ +2007-11-08 Joerg Wunsch + + * main.c: Partially revert the line buffered output change, + and turn stderr into unbuffered output while producing the + progress report. + +2007-11-07 Joerg Wunsch + + * main.c: Add setup and teardown hooks to the programmer + definition. If present, call the setup hook immediately after + finding the respective programmer object, and schedule the + teardown hook to be called upon exit. This allows the + programmer implementation to dynamically allocate private + programmer data. + * pgm.c: (Ditto.) + * pgm.h: (Ditto.) + * avr910.c: Convert static programmer data into dynamically + allocated data. + * butterfly.c: (Ditto.) + * jtagmkI.c: (Ditto.) + * jtagmkII.c: (Ditto.) + * stk500v2.c: (Ditto.) + * usbasp.c: (Ditto.) + * usbtiny.c: (Ditto.) + +2007-11-06 Joerg Wunsch + + * butterfly.c: Remove the no_show_func_info() calls, as Brian + promised some 4 years ago. + +2007-11-06 Joerg Wunsch + + * main.c: Add the -x option to pass extended parameters to + the programmer backend. + * pgm.c: (Ditto.) + * pgm.h: (Ditto.) + * jtagmkII.c: Implement the extended parameter jtagchain= + to support JTAG daisy-chains. + * avrdude.1: Document all of the above. + * doc/avrdude.texi: (Ditto.) + +2007-10-30 Joerg Wunsch + + * configure.ac (AC_INIT): Bump version for post-release. + +2007-10-29 Joerg Wunsch + + * configure.ac (AC_INIT): Bump version, releasing avrdude-5.5. + +2007-10-29 Joerg Wunsch + + Submitted by : + patch #5007: Patch for line-buffering of stdout and stderr + * main.c: call setvbuf() for stdout and stderr. + +2007-10-29 Joerg Wunsch + + Submitted by : + patch #5953: Add AT90CAN64 and AT90CAN32 to avrdude.conf + * avrdude.conf.in: Add entry for AT90CAN64 and AT90CAN32. + +2007-10-29 Joerg Wunsch + + Submitted by Wolfgang Moser: + patch #6121: ISP support for the C2N232I device (serial port + bitbanging) + * avrdude.conf.in: Add entry for c2n232i. + +2007-10-29 Joerg Wunsch + + Submitted by : + patch #6141: accept binary format immediate values + * fileio.c: Detect a 0b prefix, and call strtoul() differently + in that case. + +2007-10-29 Joerg Wunsch + + bug #21076: -vvvv serial receive prints are empty in Win32 build + * ser_win32.c (ser_recv): Drop the essentially unused variable + "len", and use the variable "read" in order to track how many + bytes have just been read in. + +2007-10-29 Joerg Wunsch + + bug #21145: atmega329p not recognized + * avrdude.conf.in: Add definitions for the ATmega329P/3290P. + Same as ATmega329/3290 except of the different signature. + +2007-10-29 Joerg Wunsch + + bug #21152: Unable to program atmega324p with avrdude 5.4 and AVRISP + using default configuration file. + * avrdude.conf.in: Uncomment the (bogus) stk500_devcode lines for + the ATmega164P, ATmega324P, ATmega644, and ATmega644P definitions. + This only affects users of STK500v1 firmware. + +2007-10-29 Joerg Wunsch + + Submitted by : + Patch #6233: Add support for USBtinyISP programmer + * usbtiny.c: New file. + * usbtiny.h: (Ditto.) + * Makefile.am: Include usbtiny into the build. + * avrdude.conf.in: (Ditto.) + * config_gram.y: (Ditto.) + * lexer.l: (Ditto.) + * avrdude.1: Document the usbtiny support. + * doc/avrdude.texi: (Ditto.) + +2007-10-29 Joerg Wunsch + + * doc/avrdude.texi: Sort list of supported programmers into + alphabetical order, add all missing programmers. + +2007-07-24 Thomas Fischl + + * usbasp.c: Added long addresses to support devices with more + than 64kB flash. Closes bug #20558: Long address problem with + USBasp. + +2007-06-27 Joerg Wunsch + + * Makefile.am (EXTRA_DIST): Add ChangeLog-2004-2006. + +2007-05-16 Joerg Wunsch + + * configure.ac (AC_INIT): Bump version for post-release. + +2007-05-16 Joerg Wunsch + + * configure.ac (AC_INIT): Bump version, releasing avrdude-5.4. + +2007-05-16 Joerg Wunsch + + * avrdude.conf.in: Fix AVR910 devcodes. It seems that the AVR109 + listing refers to "BOOT"-type code, while the standard codes are + different (usually one below). + +2007-05-16 Joerg Wunsch + + * avr.c (avr_read, avr_write): only use the paged_load and + paged_write backend functions iff the memory area in question has + a page_size != 0. + This is supposed to fix bug #19234: avrdude-5.3.1 segfaults when + stk500v1 tries to program an ATtiny15 + +2007-05-15 Joerg Wunsch + + * avr910.c: Fall back to avr_{read,write}_byte_default(). Fixes + bug #18803: Fuse reading regression in avrdude 5.3.1 with avr910 + programmer + +2007-05-15 Colin O'Flynn + + * avrdude.conf.in: Rename the ATmega164 and ATmega324 into + ATmega164P and ATmega324P, resp. Add an entry for the ATmega644P. + Fixes bug #19769: ATmega164p not recognized + +2007-05-15 Joerg Wunsch + + * ser_posix.c (ser_send): Don't select() on the output fd before + trying to write something to the serial line. That kind of + polling isn't very useful anyway, and it seems it breaks for the + Linux CP210x USB<->RS-232 bridge driver which is certainly a bug + in the driver, but we can just avoid that bug alltogether. + +2007-05-15 Joerg Wunsch + + * avrdude.conf.in: Fix the STK500v2 ISP delay parameter for + ATmega640/1280/1281/2560/2561. Atmel has changed the XML + files after the initial release. + +2007-05-01 Colin O'Flynn + + * safemode.c: -Oops - bug in verbose output. Fixed. + -Fixed handling of cases where programmer cannot read fuses (AVR910) + * main.c: -Also fixing handling of cases where programmer cannot + read fuses + This should close one or more bugs (18803, 19570) + +2007-05-01 Colin O'Flynn + + * safemode.c: Added verbose output from safemode routines. + +2007-03-25 Colin O'Flynn + + * stk500generic.c: Forgot to close the serial port before trying to + open it again, caused problems on Windows machines. + Closes bug #19411 + +2007-02-26 Joerg Wunsch + + * avrdude.conf.in: Add the AT90PWM2/3B devices. + +2007-02-02 Thomas Fischl + + * usbasp.c: Changed return value of function usbasp_initialize to stop + avrdude on communication errors between programmer and target. + Closes bug #18581: safemode destroys fuse bits + +2007-02-01 Joerg Wunsch + + * config_gram.y: Remove duplicate definition of token K_WRITEPAGE + +2007-01-30 Joerg Wunsch + + * butterfly.c: Implement ATmega256x support for butterfly/avr109. + +2007-01-30 Joerg Wunsch + + * configure.ac: Fix subdir handling. Now finally, "make + distcheck" will include the documentation into the tarball even if + the configure had been run without the --enable-doc. + +2007-01-30 Joerg Wunsch + + * safemode.c: Obtain progname from avrdude.h rather than trying to + roll our own (duplicate) copy of it. + * avr910.c: Constify char pointers. + * avrpart.c: (Ditto.) + * avrpart.h: (Ditto.) + * butterfly.c: (Ditto.) + * config.c: (Ditto.) + * config.h: (Ditto.) + * jtagmkI.c: (Ditto.) + * jtagmkII.c: (Ditto.) + * par.c: (Ditto.) + * pgm.c: (Ditto.) + * pgm.h: (Ditto.) + * serbb_posix.c: (Ditto.) + * serbb_win32.c: (Ditto.) + * stk500.c: (Ditto.) + * stk500v2.c: (Ditto.) + * usbasp.c: (Ditto.) + +2007-01-29 Joerg Wunsch + + * avrpart.c: More backend/library abstraction and generalization: + turn the list_parts() and list_programmers() functions into + general list iteration functions that call a caller-supplied + callback for each element. Implement list_parts() and + list_programmers() as private functions in main.c based on that + approach. + * avrpart.h: (Ditto.) + * main.c: (Ditto.) + * pgm.c: (Ditto.) + * pgm.h: (Ditto.) + +2007-01-25 Joerg Wunsch + + * Makefile.am: Rearrange everything so it is now built into a + libavrdude.a library, and link main.c against that library. + * configure.ac: Add AC_PROG_RANLIB as we are building a library + now. + +2007-01-24 Joerg Wunsch + + Major code cleanup. + - Make all internal functions "static". + - Make sure each module's header and implementation file match. + - Remove all library-like functionality from main.c, so only + the actual frontend remains in main.c. + - Add C++ brackets to all header files. + * avr.c: (Ditto.) + * avr.h: (Ditto.) + * avr910.c: (Ditto.) + * avr910.h: (Ditto.) + * avrdude.h: (Ditto.) + * avrpart.c: (Ditto.) + * avrpart.h: (Ditto.) + * bitbang.h: (Ditto.) + * butterfly.h: (Ditto.) + * config.c: (Ditto.) + * config.h: (Ditto.) + * confwin.h: (Ditto.) + * crc16.c: (Ditto.) + * crc16.h: (Ditto.) + * fileio.c: (Ditto.) + * fileio.h: (Ditto.) + * jtagmkI.h: (Ditto.) + * jtagmkII.h: (Ditto.) + * lexer.l: (Ditto.) + * lists.h: (Ditto.) + * main.c: (Ditto.) + * par.h: (Ditto.) + * pgm.c: (Ditto.) + * pgm.h: (Ditto.) + * ppi.c: (Ditto.) + * ppi.h: (Ditto.) + * safemode.h: (Ditto.) + * serbb.h: (Ditto.) + * serial.h: (Ditto.) + * stk500.h: (Ditto.) + * stk500v2.c: (Ditto.) + * stk500v2.h: (Ditto.) + * term.c: (Ditto.) + * term.h: (Ditto.) + * usbasp.h: (Ditto.) + * update.c: New file. + * update.h: New file. + * Makefile.am: Include update.c and update.h. + +2007-01-24 Joerg Wunsch + + Move all "extern" declarations into a centreal header file. + * Makefile.am: Add new avrdude.h. + * avrdude.h: New file. + * avr.c: Replace private extern decl's by #include "avrdude.h". + * avr910.c: (Ditto.) + * avrpart.c: (Ditto.) + * bitbang.c: (Ditto.) + * butterfly.c: (Ditto.) + * config.c: (Ditto.) + * config_gram.y: (Ditto.) + * fileio.c: (Ditto.) + * jtagmkI.c: (Ditto.) + * jtagmkII.c: (Ditto.) + * lexer.l: (Ditto.) + * main.c: (Ditto.) + * par.c: (Ditto.) + * pgm.c: (Ditto.) + * ppi.c: (Ditto.) + * ppiwin.c: (Ditto.) + * ser_avrdoper.c: (Ditto.) + * ser_posix.c: (Ditto.) + * ser_win32.c: (Ditto.) + * serbb_posix.c: (Ditto.) + * serbb_win32.c: (Ditto.) + * stk500.c: (Ditto.) + * stk500generic.c: (Ditto.) + * stk500v2.c: (Ditto.) + * term.c: (Ditto.) + * usb_libusb.c: (Ditto.) + * usbasp.c: (Ditto.) + +2007-01-13 Joerg Wunsch + + * avrdude.conf.in (ATmega8): Bump the delay values for flash + and EEPROM, based on the current Atmel XML file. + +2007-01-12 Joerg Wunsch + + * configure.ac: Improve the detection of the Win32 HID library, + and the presence of the header ddk/hidsdi.h. It now works + correctly under Cygwin and several flavours of MinGW. + * Makefile.am: Add new LIBHID pattern. + +2007-01-11 Joerg Wunsch + + * butterfly.c (butterfly_initialize): when sending the 'T' + command (which is ignored by current AVR109 bootloaders), + send the first reply from the list of supported device + codes back rather than using avrdude.conf's idea about + an AVR910 device code. Apparently, this solves disagreements + between different versions of at least the ATmega8 AVR910 + device code. + Closes bug #18727: Writing flash failed + +2007-01-07 Joerg Wunsch + + Reported by Till Harbaum: + * avrdude.conf.in (ATtiny25/45/85): Change HVSP reset from + 500 microseconds to 1 ms, matching the most recent Atmel XML + specs. diff --git a/xs/src/avrdude/ChangeLog-2008 b/xs/src/avrdude/ChangeLog-2008 new file mode 100644 index 000000000..f43a10abb --- /dev/null +++ b/xs/src/avrdude/ChangeLog-2008 @@ -0,0 +1,185 @@ +2008-11-20 Joerg Wunsch + + * avrdude.h: Change the prototype for usleep() to be more Cygwin- + friendly. + * ppiwin.c: (Ditto.) + +2008-11-06 Joerg Wunsch + + Submitted by limor + * usbtiny.c (usbtiny_cmd): Replace sizeof() by a fixed constant + 4 for the result array, because otherwise it would take the size + of a pointer which miserably fails on 64-bit machines. + +2008-11-05 Joerg Wunsch + + patch #6609: Using PCI parallel port cards on Windows + * ppiwin.c (ppi_open): If the port parameter passed from the + -p option is neither lpt1/2/3, try interpreting it directly as + a base address. + * avrdude.1: Document the change. + * doc/avrdude.texi: (Ditto.) + +2008-11-04 Joerg Wunsch + + bug #22882: Erase Cycle Counter does not work for stk500v2 + * stk500v2.c (stk500v2_chip_erase,stk500hv_chip_erase): Return + the expected 0 for success rather than a protocol-dependant + number. + +2008-11-04 Joerg Wunsch + + bug #22883: Chip Erase performed even with no-write flag (-n) + * main.c: Do not erase the chip if both, -e and -n options have + been specified. + +2008-11-04 Joerg Wunsch + + bug #24589: AT90USB64* have wrong signature + * avrdude.conf.in: Uncomment the correct, and delete the wrong + signature for AT90USB646/647. Alas, the datasheet has never been + corrected for years. + +2008-10-31 Joerg Wunsch + + * jtagmkII.c: Fix a serious memory corruption that happened when + using the JTAG ICE mkII (or AVR Dragon) in ISP mode. The wrong + set of per-programmer private data had been allocated (stk500v2 + vs. jtagmkII) which was too small to hold the actual data. + * jtagmkII.h: (Ditto.) + * stk500v2.c: (Ditto.) + +2008-07-29 Joerg Wunsch + + * jtagmkII.c: Implement Xmega JTAG support. + * jtagmkII_private.h: Add EMULATOR_MODE_JTAG_XMEGA. + +2008-07-29 Joerg Wunsch + + * main.c: Remember whether the device initialization worked, and + allow to continue with -F if it failed yet do not attempt to + perform anything on the device itself. That way, -tF could be + specified for programmers like the STK500/STK600 even without a + device connected, just in order to allow changing parameters on + the programmer itself. + * avrdude.1: Document that possible use of the -F option. + * doc/avrdude.texi: (Ditto.) + +2008-07-29 Joerg Wunsch + + * stk500v2.c (stk600_xprog_paged_write): Fix a fatal miscalculation + of the number of bytes to be written which caused a malloc chunk + corruption. + +2008-07-27 Joerg Wunsch + + First implementation of ATxmega support. By now, only the + PDI mode of the STK600 is supported. Single-byte EEPROM + (and flash) updates do not work yet. + * avr.c: "boot" memory is a candidate memory region for paged + operations, besides "flash" and "eeprom". + * avrdude.conf.in: add ATxmega128A1 and ATxmega128A1revD + * avrpart.h: add the AVRPART_HAS_PDI flag (used to distinguish + ATxmega parts from classic AVRs), the nvm_base part field, and + the offset field for a memory region. + * config_gram.y: add "has_pdi", "nvm_base", and "offset" + * lexer.l: (Ditto.) + * main.c: disable auto_erase for ATxmega parts + * stk500v2.c: implement the XPROG functionality, and divert to + this for ATxmega parts + * avrdude.1: Document the changes. + * doc/avrdude.texi: (Ditto.) + +2008-07-25 Joerg Wunsch + + Fix a bunch of warnings. + * avr910.c (avr910_paged_load): possible unitialized use of + rd_size + * jtagmkI.c (jtagmkI_initialize): pointer signedness mixup + * jtagmkII.c (jtagmkII_print_parms1): propagate const'ness + of parameter + * usbasp.c (usbasp_transmit): pointer signedness mixup + * ser_avrdoper.c (usbGetReport): remove useless pointer deref + +2008-07-25 Joerg Wunsch + + Contributed by Ville Voipio: + patch #6501: New autotools support for avrdude + * Makefile.am: add @WINDOWS_DIRS@ to SUBDIR + * bootstrap: allow for autconf-2.61 and automake-1.10, too + * configure.ac: fix @WINDOWS_DIRS@ recursion, replace + AC_PROG_CC by AM_PROG_CC_C_O, for esoteric reasons + +2008-06-13 Joerg Wunsch + + Contributed by Janos Sallai : + patch #6074: added support for crossbow's MIB510 programmer + * avrdude.conf.in: Add entry for mib510. + * stk500.c: Add special hooks to handle the MIB510 programmer. + It mostly talks STK500v1 protocol but has a special hello and + goodbye sequence, and uses a fixed block size of 256 bytes. + * doc/avrdude.texi: Document support for mib510. + +2008-06-07 Joerg Wunsch + + Contributed by Klaus Leidinger : + * main.c: Realign verbose messages. + * avrpart.c: (Ditto.) + * avr910.c: Print the device code selected in verbose mode. + * butterfly.c: (Ditto.) + +2008-06-07 Joerg Wunsch + + Contributed by Klaus Leidinger : + Add check for buffermode feature, and use it if present. Can be + turned off using -x no_blockmode. + * avr910.c: Implement buffermode test and usage. + * avrdude.1: Document -x no_blockmode. + * doc/avrdude.texi: (Ditto.) + +2008-03-24 Joerg Wunsch + + * usb_libusb.c: #undef interface for Win32 + +2008-03-24 Joerg Wunsch + + * avr910.c: Add support for the -x devcode option. + * avrdude.1: Document -x devcode for avr910. + * doc/avrdude.texi: (Ditto.) + +2008-03-14 Joerg Wunsch + + Add initial support for the Atmel STK600, for + "classic" AVRs (AT90, ATtiny, ATmega) in both, + ISP and high-voltage programming modes. + * Makefile.am: Add -lm. + * avrdude.conf.in: Add stk600, stk600pp, and stk600hvsp. + * config_gram.y: Add support for the stk600* keywords. + * lexer.l: (Ditto.) + * pgm.h: Add the "chan" parameter to set_varef(). + * stk500.c: (Ditto.) + * serial.h: Add USB endpoint support to struct filedescriptor. + * stk500v2.c: Implement the meat of the STK600 support. + * stk500v2.h: Add new prototypes for stk600*() programmers. + * stk500v2_private.h: Add new constants used in the STK600. + * term.c: Add AREF channel support. + * usb_libusb.c: Automatically determine the correct write + endpoint ID, the STK600 uses 0x83 while all other tools use + 0x82. Propagate the EP to use through struct filedescriptor. + * usbdevs.h: Add the STK600 USB product ID. + * tools/get-stk600-cards.xsl: XSL transformation for + targetboards.xml to obtain the list of socket and routing + card IDs, to be used in stk500v2.c (for displaying the + names). + * tools/get-stk600-devices.xsl: XSL transformation for + targetboards.xml to obtain the table of socket/routing cards + and their respective AVR device support for doc/avrdude.texi. + * avrdude.1: Document all the STK600 stuff. + * doc/avrdude.texi: Ditto. Added a new chapter for + Programmer Specific Information. + +2008-01-26 Joerg Wunsch + + * stk500v2.c (stk500v2_recv): Make length computation unsigned so + it cannot accidentally become negative. + diff --git a/xs/src/avrdude/ChangeLog-2009 b/xs/src/avrdude/ChangeLog-2009 new file mode 100644 index 000000000..1f993cbcf --- /dev/null +++ b/xs/src/avrdude/ChangeLog-2009 @@ -0,0 +1,411 @@ +2009-11-09 David Hoerl + + * fileio.c: ihex2bin did not properly handle files > 64K bytes + * usb_libusb.c: re-enabled usb_reset for Macs (no reset causes lots of failures) + * avrdude.1: spacing issue for avr32 fixed. + +2009-11-09 Michal Ludvig + + * buspirate.c: Implemented reset= and speed= extended parameters. + * avrdude.1: Document the change. + +2009-11-04 Michal Ludvig + + * configure.ac, Makefile.am: Test if GCC accepts -Wno-pointer-sign + +2009-11-04 Michal Ludvig + + * buspirate.c: Implemented 'BinMode' support for + firmware 2.7 and higher. + * avrdude.1: Added info about BusPirate. + +2009-11-03 Michal Ludvig + + * arduino.c: Add on to bug #26703 / patch #6866 - clear DTR/RTS + when closing the port. + * Makefile.am: Silent warnings about signedness - they're useless + and annoying, especially for 'char' vars. + +2009-10-22 David Hoerl + + * usb_libusb.c: disabled usb_reset for Macs (same as FreeBSD) + +2009-10-12 Michal Ludvig + + * main.c: Re-added default to serial port for BusPirate. + +2009-10-12 David Hoerl + + * main.c: removed some avr32 code that was pushed into jtagmkII.c + * jtagmkII.c: consolodated the avr32 reset code and avr32_chipreset + * avrpart.h: modified AVRPART flags for avr32 + * lexer.l: added is_avr32 flag - only way to get yacc code to set flag + * avrdude.conf.in: updated avr32 section to include "is_avr32" flag + +2009-10-12 David Hoerl + + * config_gram.y: Restored inadvertantly removed buspirate entry + * lexer.l: Restored inadvertantly removed buspirate entry + +2009-10-12 Michal Ludvig + + * buspirate.c: Replace GNU-only %as with %s in sscanf call. + * ser_win32.c(ser_set_dtr_rts): Fixed typo in parameter name. + * NEWS: Announce BusPirate. + +2009-10-11 David Hoerl + + Support for AVR32 + + * AUTHORS: added myself + * NEWS: announced AVR32 support + * main.c: AVR32 flag tests to avoid several code blocks + * fileio.c: mods to ihex read function to handle address offsets and + size of avr32 + * jtagmkI.c: added cast to printf call to remove warning + * arduino.c: added header file to bring in prototype for usleep() + * config_gram.y: added defines for avr32, new jtag_mkii variant for avr32 + * jtagmkII_private.h: new jtag_mkii message types defined (used by + avr32program) + * jtagmkII.h: extern jtagmkII_avr32_initpgm() addition + * jtagmkII.c: huge amount of code in support of avr32 + * avrpart.h: additional flags to AVRPART for avr32 + * usb_libusb.c: modified verbose test for USB read per-byte messages by + by one, so with verbose=3 you get just full messages, 4 gives you bytes + too + * lexer.l: additions for avr32 + +2009-10-10 Michal Ludvig + + Support for Arduino auto-reset: + * serial.h, ser_avrdoper.c, ser_posix.c, ser_win32.c: Added + serial_device.set_dtr_rts implementations. + * arduino.c, stk500.c, stk500.h: Call serial_set_dtr_rts() + to reset Arduino board before program upload. + Inspired by patch #6866, resolves bug #26703 + +2009-10-08 Michal Ludvig + + * buspirate.c: Optimised buspirate_cmd() - reading 1kB EEPROM now + takes only 14 sec instead of almost 2 mins with the original + implementation. + +2009-10-08 Michal Ludvig + + * buspirate.c, buspirate.h: Support for the BusPirate programmer + * config_gram.y, avrdude.conf.in, main.c, lexer.l, Makefile.am: + Glue for BusPirate. + +2009-08-17 Joerg Wunsch + + * usb_libusb.c (usbdev_close): Repair the logic around the + conditional compilation of usb_reset() introduced in r798. + +2009-07-11 Joerg Wunsch + + * configure.ac: We are post-5.8 now. + +2009-07-11 Joerg Wunsch + + * configure.ac: Prepare for releasing version 5.8 + +2009-07-11 Joerg Wunsch + + Submitted by Roger Wolff: + bug #26527: bug in unicode conversion + * ser_avrdoper.c (convertUniToAscii): when encountering a UTF-16 + character that cannot be converted to ASCII, increment the UTF-16 + pointer anyway when proceeding. + +2009-07-11 Joerg Wunsch + + * jtagmkI.c (jtagmkI_send): Replace %zd format by %u since not all + implementations do understand the C99 formatting options (sigh). + * jtagmkII.c (jtagmkII_send): (Ditto.) + * stk500v2.c (stk500v2_recv): (Ditto.) + +2009-07-11 Joerg Wunsch + + bug #26002: HVPP of EEPROM with AVR Dragon and ATmega8 Fails + * avrdude.conf.in (ATmega8): add page size for EEPROM. + +2009-07-07 Joerg Wunsch + + * stk500v2.c: Fix a serious memory corruption problem resulting + out of the chaining of both, the stk500v2 and the jtagmkII + programmers for some programming hardware (JTAG ICE mkII and AVR + Dragon running in ISP, HVSP or PP mode), where both programmers + have to maintain their private programmer data. + +2009-07-02 Joerg Wunsch + + * configure.ac: Post-release (is pre-release...) + +2009-07-02 Joerg Wunsch + + * configure.ac: Prepare for releasing version 5.7 + +2009-07-02 Joerg Wunsch + + * main.c: Add my name to the copyright output when being verbose. + +2009-07-02 Joerg Wunsch + + Contributed by Shaun Jackman + bug #21798: Fix both XSLT scripts + * tools/get-dw-params.xsl (format-hex): Add the parameter count. + * tools/get-hv-params.xsl (format_cstack): Ditto. + +2009-07-02 Joerg Wunsch + + bug #21922: ATmega163 still not working in version 5.5 + * avrdude.conf.in (atmega163): fill in stk500v2 parameters, correct + some flash programming parameters as well. + +2009-07-02 Joerg Wunsch + + bug #22206: avrdude: ser_setspeed(): tcsetattr() failed + * ser_posix.c (ser_setspeed): Don't pass TCSAFLUSH to tcsetattr() as + it apparently fails to work on Solaris. After reading the + documentation again, it seems TCSAFLUSH and TCSANOW are indeed + mutually exclusive. + +2009-07-02 Joerg Wunsch + + bug #22234: WINDOWS version: HOWTO: Specify Serial Ports Larger than COM9 + * ser_win32.c (ser_open): prepend \\.\ to any COM port name, so it is + safe to be used for COM ports above 9. + +2009-07-02 Joerg Wunsch + + bug #26408: Crash in stk500v2_open() + * stk500generic.c: Implement setup and teardown hooks, calling in turn + the respective hooks of the stk500v2 implementation. + +2009-07-02 Joerg Wunsch + + bug #26130: Avrdude doesn't display it's version. + * main.c (usage): add a version number display to the default usage + message. + +2009-07-01 Joerg Wunsch + + bug #26412: avrdude segfaults when called with a programmer that does not + support it + * main.c: do not call pgm->perform_osccal() unless it is != 0. + +2009-06-24 Joerg Wunsch + + Contributed by Zoltan Laday: + patch #6825: xmega problems with JTAGICEmkII + * jtagmkII.c: Many fixes for Xmega devices. + * jtagmkII_private.h: Add various new constants required for + Xmega devices. + * avrdude.conf.in: New devices: ATXMEGA64A1, ATXMEGA192A1, + ATXMEGA256A1, ATXMEGA64A3, ATXMEGA128A3, ATXMEGA192A3, + ATXMEGA256A3, ATXMEGA256A3B, ATXMEGA16A4, ATXMEGA32A4, + ATXMEGA64A4, ATXMEGA128A4 + * avr.c (avr_read, avr_write): Add more names for (Xmega) + memory areas that require paged operation. + +2009-06-24 Joerg Wunsch + + * stk500v2.c (stk600_xprog_write_byte): Handle writing fuse bytes. + +2009-04-28 Joerg Wunsch + + Submitted by Carl Hamilton: + * update.c (parse_op): correctly \0-terminate buf after filling + it, before it is potentially used as the source of a call to + strlen or strcpy. + +2009-04-14 Joerg Wunsch + + * doc/avrdude.texi: Merge the -P 0xXXX option description from + avrdude.1. + +2009-04-14 Joerg Wunsch + + * configure.ac: declare AM_PROG_CC_C_O to avoid the warning + "compiling `config_gram.c' with per-target flags + requires `AM_PROG_CC_C_O' in `configure.ac'" + +2009-03-22 Joerg Wunsch + + bug #25971: "error writing to " with multiple -U params. + * fileio.c: Do not close the input/output stream when working on an + stdio stream. + +2009-02-28 Thomas Fischl + + Based on patch #6484 commited by Jurgis Brigmanis: + * usbasp.c: added software control for ISP speed + * usbasp.h: (Ditto.) + +2009-02-28 Joerg Wunsch + + * avr910.c (avr910_read_byte_flash): Eliminate a static variable that + hasn't been in use for 5 years. + +2009-02-27 Joerg Wunsch + + * configure.ac: Post-release 5.6. + +2009-02-27 Joerg Wunsch + + * configure.ac: Prepare for releasing version 5.6. + +2009-02-27 Joerg Wunsch + + Submitted by Ed Okerson: + * jtagmkII.c (jtagmkII_read_byte): Fix signature reading of + Xmega. + +2009-02-26 Joerg Wunsch + + Submitted by Mikael Hermansson: + * avrdude.conf.in (ATxmega256A3): new device. + * stk500v2 (stk500v2_initialize): Enable the AVRISPmkII as a + PDI-capable device for ATxmega parts. + +2009-02-25 Joerg Wunsch + + Submitted by Lars Immisch: + patch #6750: Arduino support - new programmer-id + * arduino.c: New file, inherits stk500.c. + * arduino.h: New file. + * Makefile.am: Add arduino.c and arduino.h. + * config_gram.y: Add arduino keyword. + * lexer.l: (Ditto.) + * avrdude.conf.in: (Ditto.) + * avrdude.1: Document the new programmer type. + * doc/avrdude.texi: (Ditto.) + +2009-02-25 Joerg Wunsch + + * stk500v2.c: Turn all non-const static data into instance data. + +2009-02-25 Joerg Wunsch + + * Makefile.am: Move term.[ch] from the library into the CLI + application section, as it is not useful for anything else but + the CLI frontend. + +2009-02-25 Joerg Wunsch + + * avrdude.conf.in (ATmega1284P): new device. + +2009-02-23 Joerg Wunsch + + More fixes for Solaris, including fixes for the Sunpro compiler: + * avr.h: Remove stray semicolon. + * configure.ac: Add check for predefined types uint_t and ulong_t. + * confwin.c: Include "avrdude.h" on top to avoid empty translation + unit warning. + * ppwin.c: (Ditto.) + * ser_win32.c: (Ditto.) + * serbb_win32.c: (Ditto.) + * jtagmkII.c (jtagmkII_recv): remove unreachable "return". + * stk500.c (stk500_initialize): (Ditto.) + * par.c: Test for both, __sun__ and __sun to see whether we are + being compiled on Solaris. + * ppi.c: (Ditto.) + * stk500v2.c: Implement the DEBUG and DEBUGRECV macros in a way + that is compatible with the ISO C99 standard. + * usbtiny.c: Only typedef uint_t and ulong_t if they have not + been found already by the autoconf checks. + +2009-02-23 Joerg Wunsch + + bug #22204: Solaris10/11 Undefiniertes Symbol gethostbyname socket + connect + * configure.ac: Add checks for gethostent() and socket(). + While being here, remove some old cruft left from ancient days. + +2009-02-22 Joerg Wunsch + + * lexer.l: Bump the %p size so AT&T lex will continue to work. + +2009-02-19 Joerg Wunsch + + (Partially) submitted by John Voltz: + bug #20004: AVRDUDE update (-U) operations do not close files + * fileio.c (fmt_autodetect, fileio): fclose() files. + +2009-02-18 Joerg Wunsch + + * usbtiny.c: Replace all but one (very unlikely to trigger) exit(1) + by return -1. + +2009-02-18 Joerg Wunsch + + Submitted by Dick Streefland: + patch #6749: make reading from the USBtinyISP programmer more robust + * usbtiny.c: Add code to retry failed communication attempts. + +2009-02-17 Joerg Wunsch + + Submitted by Nick Hibma: + bug #22271: usb_reset in usb_libusb.c not necessary in FreeBSD 6.x + * usb_libusb.c (usbdev_close): Do not call usb_reset() on FreeBSD. + It is not necessary there. + +2009-02-17 Joerg Wunsch + + Submitted by Andrew O. Shadoura: + bug #25156: add direct SPI transfer mode + * bitbang.c: Implement direct SPI transfers. + * bitbang.h: (Ditto.) + * par.c: (Ditto.) + * pgm.c: (Ditto.) + * pgm.h: (Ditto.) + * term.c: Add the "spi" and "pgm" commands. + * avrdude.1: Document the changes. + * doc/avrdude.texi: (Ditto.) + +2009-02-17 Joerg Wunsch + + Submitted by Limor ("Lady Ada"): + bug #24749: add support for '328p + * avrdude.conf.in (ATmega328P): new device support. + +2009-02-17 Joerg Wunsch + + Submitted by "Womo": + bug #25241: AT90USB162, AT90USB82 device support patch for avrdude-5.5 + (also: bug #21745: AT90USBxx2 support) + * avrdude.conf.in (AT90USB162, AT90USB82): new device support. + +2009-02-17 Joerg Wunsch + + Submitted by Evangelos Arkalis: + patch #6069: Atmel AT89ISP Cable + * avrdude.conf.in (89isp): new programmer support. + +2009-02-16 Joerg Wunsch + + Submitted by Bob Paddock: + patch #6748: ATTiny88 Config + * avrdude.conf.in (ATtiny88): new device support. + +2009-02-16 Joerg Wunsch + + Submitted by Mark Litwack: + patch #6261: avrdude won't use dragon/debugwire to write a file + to eeprom + * jtagmkII.c (jtagmkII_paged_write): when in debugWire mode, + implement a paged write to EEPROM as a series of byte writes. + +2009-02-16 Joerg Wunsch + + Submitted by Janos Sallai: + patch #6542: paged_load fails on the MIB510 programming board + * stk500.c: Add a workaround for the different signon sequence on + MIB510 programmers. + +2009-02-05 Joerg Wunsch + + * avrdude.conf.in: Add the ATmega128RFA1. + * avrdude.1: document the addition of ATmega128RFA1. + * doc/avrdude.texi: (Ditto.) + diff --git a/xs/src/avrdude/ChangeLog-2010 b/xs/src/avrdude/ChangeLog-2010 new file mode 100644 index 000000000..45effefa4 --- /dev/null +++ b/xs/src/avrdude/ChangeLog-2010 @@ -0,0 +1,354 @@ +2010-12-17 Joerg Wunsch + + * avrdude.conf.in (ATmega128RFA1): Bump two timing values in order to + improve ISP programming stability, in particular with the STK600. + +2010-12-14 Joerg Wunsch + + * stk500v2.c (stk500v2_command): Detect warning status codes. + +2010-10-22 Nils Springob + + * serial.h: serial_open() calls will now return -1 on error (no call to exit()) + * buspirate.c: (Dito.) + * jtagmkII.c: (Dito.) + * butterfly.c: (Dito.) + * jtagmkI.c: (Dito.) + * arduino.c: (Dito.) + * avr910.c: (Dito.) + * stk500.c: (Dito.) + * ser_avrdoper.c: (Dito.) + * stk500v2.c: (Dito.) + * ser_posix.c: (Dito.) + * usb_libusb.c: (Dito.) + +2010-07-27 Joerg Wunsch + + bug #30566: MinGW + Ubuntu 9.04 + * stk500v2.c (stk500v2_open): use same condition to refer to the AVR + Doper support as used in the definition in ser_avrdoper.c. + (Thanks to Christian Starkjohann for the analysis of the problem.) + +2010-07-19 Michal Ludvig + + * buspirate.c: Added compatibility with BusPirate "NewUI" firmware 5.x + (contributed by Kari Knuuttila) + +2010-07-12 Nils Springob + + * avrdude.conf.in (atmega88p): New device. + +2010-06-03 Joerg Wunsch + + bug #29913: 246 Byte Bug - AVRdude crashes + doc/avrdude.texi (Troubleshooting): Mention the libusb 0.1 API + wrapper issue that is present in some Linux versions. + +2010-03-19 Joerg Wunsch + + bug #29263: Can't build avrdude on windows using latest cygwin 1.7.1 + * doc/avrdude.texi: Remove the recommendation for building + Win32 binaries under Cygwin; mention MinGW as an alternative + environment. + +2010-03-08 Michal Ludvig + + * ser_posix.c(ser_set_dtr_rts): Fixed DTR on/off to make + Arduino auto-reset work. (bug #29108, patch #7100) + +2010-03-05 Joerg Wunsch + + * buspirate.c: Replace printf() by fprintf(stderr) + * safemode.c: (Dito.) + * usbtiny.c: (Dito.) + +2010-01-22 Joerg Wunsch + + Cleanup Cygwin builds. + * windows/Makefile.am (loaddrv_LDFLAGS): remove, the -mno-cygwin + flag is supposed to be set in CFLAGS by ./configure + * configure.ac: add a check for the presence of usleep(), add a + check whether the linker accepts -static + * avrdude.h: protect prototype for usleep by !defined(HAVE_USLEEP) + * ppwin.c (usleep): protect by !defined(HAVE_USLEEP) + * main.c: silence "array subscript of type char" compiler warnings + by casting all arguments to tolower()/toupper() and isspace()/ + isdigit()/ispunct() to "int" + * butterfly.c: (Dito.) + * avr910.c: (Dito.) + +2010-01-19 Joerg Wunsch + + * configure.ac: Bump for post-5.10. + +2010-01-19 Joerg Wunsch + + * configure.ac: Released version 5.10. + +2010-01-19 Joerg Wunsch + + bug #28677: Cygwin's GCC no longer supports -mno-cygwin option + * configure.ac: For Win32 environments, add a check whether the + compiler understands the -mno-cygwin option. If not, don't use + it but suggest using a different compiler. + +2010-01-18 David Hoerl + + bug #28660: Problem with loading intel hex rom files that exceed + 0x10000 bytes + * fileio.c: Fix two byte shifts. + +2010-01-15 Joerg Wunsch + + Submitted by Michael biebl: + * configure.ac: Fix FreeBSD default serial port name. + * doc/avrdude.texi: (Dito.) + +2010-01-15 Joerg Wunsch + + * jtagmkII.c: If entering JTAG mode fails with a bad JTAG ID + message, retry with external reset applied (in case the target + is in sleep mode or has asserted the JTD bit). + +2010-01-15 Joerg Wunsch + + Submitted by Aurelien Jarno: + * configure.ac: Fix build for GNU/kFreeBSD. + * ppi.c: (Dito.) + * par.c: (Dito.) + +2010-01-15 Joerg Wunsch + + * configure.ac: Bump version for post-5.8. + +2010-01-15 Joerg Wunsch + + * configure.ac: Bump version for release 5.8. + +2010-01-15 Joerg Wunsch + + Submitted by Soren Jorvang: + bug #28611: -i delay not being applied to all serial port + bit banging state transitions + * serbb_win32.c: Apply ispdelay everywhere. + * serbb_posix.c: (Dito.) + +2010-01-15 Joerg Wunsch + + * stk500v2_private.h: Implement TPI mode for AVRISPmkII/STK600 + * config_gram.y: (Dito.) + * avrpart.h: (Dito.) + * stk500v2.c: (Dito.) + * main.c: (Dito.) + * lexer.l: (Dito.) + * avrdude.conf.in: Add ATtiny4/5/9/10 + * avrdude.1: Document TPI and new device support. + * doc/avrdude.texi: (Dito.) + +2010-01-14 Joerg Wunsch + + Submitted by clint fisher: + patch #7038: Adding Atmega32U4 Device to avrdude.conf.in + * avrdude.conf.in (atmega32u4): New device. + * avrdude.1: Document the new device support. + * doc/avrdude.texi: (Dito.) + +2010-01-14 Joerg Wunsch + + Submitted by Thomas Pircher: + patch #6927: Documentation patches + * doc/avrdude.texi: Fix various typos, and remove the last + remnants of obsoleted options -i/-o/-m/-f. + * avrdude.1: Merge typo fixes from avrdude.texi where + applicable. + +2010-01-14 Joerg Wunsch + + * avrdude.1: Update documentation to match the reality (device + support, memory areas). + * doc/avrdude.texi: Update documentation to match the + reality (device support, programmer support, memory areas). + Merge buspirate-specific comments from avrdude.1. + * jtagmkII.c: Add some firmware feature checks. + +2010-01-13 Joerg Wunsch + + * jtagmkII.c: Implement PDI mode support for the JTAG ICE mkII + and the AVR Dragon. + * jtagmkII.h: (Dito.) + * config_gram.y: (Dito.) + * jtagmkII_private.h: (Dito.) + * avrdude.conf.in: (Dito.) + * lexer.l: (Dito.) + +2010-01-13 Joerg Wunsch + + * stk500v2.c: Update STK600 routing and socket card data from XML + file. + +2010-01-13 Joerg Wunsch + + * stk500v2.c: Cleanup the open/close handling to avoid accessing + unallocated memory (in the atexit handler) in case of bailing out. + * main.c: (Ditto.) + +2010-01-13 Joerg Wunsch + + * jtagmkII.c: Stylistic changes: move #defines out into + jtagmkII_private.h, drop all #if 0 blocks, fold overly long lines, + move the *_initpgm() functions to the end of the file; while being + here, remove all trailing whitespace. + * jtagmkII_private.h: move AVR32 #defines here. + +2010-01-12 Joerg Wunsch + + * bootstrap: autoconf 2.62 works well. + +2010-01-12 Joerg Wunsch + + Various fixes for Xmega devices. + * avrdude.conf.in: Correctly declare EEPROM page sizes for + all Xmega devices (0x20 instead of 0x100). + * avr.c: If a memory region has a page size declared, try + using the paged IO routines regardless of the target memory + name. Xmega EEPROM requires to be written in paged mode. + Correctly use a long (rather than unsigned long) variable to + evaluate the success status of the paged mode write attempt. + * stk500v2.c: Don't apply TIF space offsets twice (bug #27995: + AVRDUDE 5.8svn fails to program and read XMEGA); use + stk500v2_loadaddr() prior to paged mode (EEPROM and flash) writes, + otherwise programming of flash areas will fail; while being there, + check the return value of stk500v2_loadaddr() everywhere; use the + correct write/erase mode bits (same as AVR Studio does). + +2010-01-12 Michal Ludvig + + * buspirate.c: Initialise firmware version to v0.0 + prior to parsing the buspirate banner. + +2010-01-11 Joerg Wunsch + + Clean-up the Xmega erase functions. + * jtagmkII_private.h: Add CMND_XMEGA_ERASE as well as + the various XMEGA_ERASE_* definitions (from updated + appnote AVR067) + * jtagmkII.c (jtagmkII_chip_erase): Correctly implement Xmega chip + erase based on CMND_XMEGA_ERASE. After erasing an Xmega part, do + *not* reinitialize the world, as a subsequent programming + operation will fail (for unknown reasons). Actually, this was + really only required for ancient AVRs, but doesn't hurt on mega + and tiny devices. + * jtagmkII.c (jtagmkII_pre_write): Remove, this turned out + to be just a chip erase. + * jtagmkII.c (jtagmkII_program_disable): Don't try reading + "hfuse" for Xmega parts; they don't have it. + * main.c (main): Re-enable auto-erase. It's been done + before (as "jtagmkII_pre_write") in jtagmkII_paged_write() + anyway. Xmega boot and application flash areas should be + handled separately in the future, so auto_erase can only + affect the area just being programmed. + +2010-01-11 Joerg Wunsch + + * main.c (main): disable safemode for Xmega parts. + +2010-01-12 Michal Ludvig + + * buspirate.c: If the BusPirate doesn't respond + to a standard a reset command assume it was in binmode + and attempt to exit to text mode first. + +2010-01-08 Joerg Wunsch + + * bitbang.c: Fix Win32 build error: move freq up to the file + level. + * buspirate.c: Fix Win32 build warning: include to + to get a declaration for alloca(). + +2010-01-08 Thomas Fischl + + bug #28520: Programming with USBasp with low clock speed fails + * usbasp.c: Change blocksize depending on sck frequency to + avoid usb transmition timeouts. + +2010-01-08 Joerg Wunsch + + bug #27505: serbb_posix does not cope with inverted pins + * serbb_posix (serbb_highpulsepin): apply PIN_MASK when + checking pin numbers. + * serbb_win32 (serbb_highpulsepin): (Dito.) + +2010-01-08 Joerg Wunsch + + bug #28516: Linux/Dragon: Error message on exit + * stk500v2.c: Fix the "bad response to GO command: + RSP_ILLEGAL_EMULATOR_MODE" message. jtagmkII_close() + has been called with the wrong pgm->cookie. Wrap it + inside stk500v2_jtagmkII_close(), adjusting the cookie + data appropriately. + +2010-01-08 Joerg Wunsch + + Submitted by Doug: + patch #7010: Win32 enhanced bitbang_delay + * bitbang.c (bitbang_calibrate_delay, bitbang_delay): On Win32, + use the high-resolution performance counter rather than the + uneducated delay loop guess if it is available on the target + hardware. + +2010-01-08 Joerg Wunsch + + Submitted by Gerard: + patch #6828: Using arbitrary BAUD rates + * ser_posix.c (serial_baud_lookup): Allow non-standard baud + rates. + * ser_win32.c (serial_baud_lookup): (Dito.) + +2010-01-07 Joerg Wunsch + + Submitted by Eric Trein: + bug #27596: AT90s2333 is not correctly supported in avrdude.conf + * avrdude.conf.in (at90s2333): add various STK500v2 parameters. + +2010-01-07 Joerg Wunsch + + Submitted by Gyorgy Szekely: + bug #28458: Buffer line is incorrectly released for PP programmers + * par.c (par_close): use par_setmany() rather than par_setpin() + for PPI_AVR_BUFF. + +2010-01-07 Joerg Wunsch + + Submitted by Lukasz Goralczyk: + bug #27507: SIGSEGV when using avrdragon (avrdude 5.8) + * stk500v2.c (stk500v2_dragon_isp_initpgm): Use + stk500v2_jtagmkII_setup/stk500v2_jtagmkII_rather than their + jtagII counterparts, to get the private data properly + initialized. + +2010-01-07 Joerg Wunsch + + * buspirate.c: Cosmetics: remove UTF-8 dashes, adjust for 8-column + hard tabs. + +2010-01-07 Joerg Wunsch + + * buspirate.c: add $ Id $ line. + * buspirate.h: add $ Id $ line. + +2010-01-07 Joerg Wunsch + + Fix a few warnings that came up recently (some of them only triggered + by recent GCC versions). + * config_gram.y (parse_cmdbits): "brkt possibly used uninitialized" + (GCC errs here) + * jtagmkII.c (jtagmkII_reset32): "status possibly used uninitialized" + (I think GCC errs, too) + * buspirate.c: "pointers differ in signedness" (mismatch between + string processing and the use of "unsigned char" throughought the + AVRDUDE API) + +2010-01-01 Joerg Wunsch + + * jtagmkII.c (jtagmkII_smc_init32): replace sleep() by usleep() for + win32 compatibility. diff --git a/xs/src/avrdude/ChangeLog-2011 b/xs/src/avrdude/ChangeLog-2011 new file mode 100644 index 000000000..d8fffba01 --- /dev/null +++ b/xs/src/avrdude/ChangeLog-2011 @@ -0,0 +1,489 @@ +2011-12-30 Rene Liebscher + + * avrdude.conf.in: Added is_at90s1200 option to part description + * doc/avrdude.texi: Added missing options to part definition + * config_gram.y: Fixed resetting of is_at90s1200 and is_avr32 flags + +2011-12-30 Rene Liebscher + + patch #7693: Fix config file atmel URLs + * avrdude.conf.in: Updated URLs + * avrpart.h: Updated URLs + * doc/avrdude.texi: Updated URLs + +2011-12-30 Joerg Wunsch + + * ser_posix.c (baud_lookup_table): Conditionalize the inclusion of + non-standard baud rates (only baud rates up to B38400 are + standardized by the Single UNIX Specification). + +2011-12-29 Rene Liebscher + + bug #34302: Feature request : device configuration with parent classes + * config_gram.y: Added part parent rule and allow overwriting existing + data at several places + * avrdude.conf.in: Added description comment and m328/m328p as example + * avrpart.c: avr_dup_mem-functions now copy buf and tags memory block + only they are already allocated. + * lexer.l: Added parent as valid token + + (not in original patch) + * avrpart.c: New function avr_dup_opcode. avr_dup_mem/avr_dup_part- + functions now duplicate the opcodes in their op-array to avoid memory leaks. + * doc/avrdude.texi: Added description of part parent feature + +2011-12-29 Rene Liebscher + + patch #7687: Autogenerating programmers and parts lists for docs + (generating the parts lists, programmers lists follows later) + * doc/Makefile.am: Add rule how to create avrdude before generating parts list + +2011-12-29 Rene Liebscher + + patch #7687: Autogenerating programmers and parts lists for docs + (generating the parts lists, programmers lists follows later) + * doc/avrdude.texi: Add include of generated table of parts + * doc/Makefile.am: Add generating of table of parts in parts.texi + * doc/parts_comments.txt: Adding file containing part commenz references + * avrdude.1: Remove table of parts and mention "-p ?" option + * avrpart.c: Use AVR_DESCLEN for strncasecmp at list sorting + +2011-12-22 Rene Liebscher + + * configure.ac: Add writing of definition of confsubst to config.status, + so it can run alone, not only called by configure. + +2011-12-17 Rene Liebscher + + patch #7680: Fixing timeout problem in ser_recv in ser_win32.c + * ser_win32.c: Return -1 at timeout in ser_recv(). + +2011-12-17 Rene Liebscher + + * config_gram.y: Fixed another memory leak, when define an operation + more than once + * avrdude.conf.in: Fixed double definition at ATmega6490 + +2011-12-17 Rene Liebscher + + * config_gram.y: Restructuring and compacting programmer definition + part of grammar (in preparation of patch #7688) + +2011-12-17 Rene Liebscher + + * avrdude.conf.in: Update documentation of programmer definition + * doc/avrdude.texi: Update documentation of programmer definition + and add list of implemented programmer types + +2011-12-17 Rene Liebscher + + patch #7667: Minor memory handling fixes + * config_gram.y: Added several free_token() calls. + +2011-12-16 Rene Liebscher + + patch #7671: Sorting programmers and parts lists for console output + * avrdude.conf.in: change part desc of several parts to common pattern + AT(mega|tiny|xmega)[0-9]+[A-Z]* (Upper case AT, lower case in middle) + * list.[ch]: added sorting function lsort() + * pgm.[ch]: added function sort_programmers() + * avrpart.[ch]: added function sort_avrparts() + * main.c: use sort functions in list_programmers() and list_parts() + * main.c: list functions show config file info only at verbose mode + +2011-10-19 Joerg Wunsch + + * configure.ac: Replace "cvs" in version number by "svn". + +2011-10-10 Joerg Wunsch + + bug #34518: loading intel hex files > 64k using record-type 4 + (Extended Linear Address Record) + fileio.c: Replace the change from r928 (handling of 0x8000000 + offset in AVR32 files) by a completely different logic that no + longer breaks hex files for other devices starting with an + offset; also apply a similar change to S-record files, as well + as when writing files. + fileio.c: (Ditto.) + +2011-09-15 Joerg Wunsch + + * avrftdi.c: Remove stray printf()s by fprintf(stderr) + * usbtiny.c: (Ditto.) + +2011-09-15 Joerg Wunsch + + * main.c: Restrict the cyclecounter readout to those cases where + it has been explicitly requested (by -y or -Y), rather than always + attempting to read the last EEPROM bytes. + +2011-09-15 Joerg Wunsch + + * stk500v2.c (stk600_xprog_paged_load, stk600_xprog_paged_write): + Fix regression in the AVRISPmkII/STK600 TPI handling introduced + by the USBasp's TPI implementation which added a pagesize even for + the minor memory regions of TPI devices. Also fix wrong offset + introduced by the memory tagging patch. + +2011-09-15 Joerg Wunsch + + * avr.c (avr_read, avr_write): Don't bail out on TPI parts if + their programmer doesn't provide a (low-level) cmd_tpi method; + instead, fall back to the normal programmer methods which are + supposed to handle the situation. + This fixes a regression where the recent bitbang-TPI implementation + broke TPI handling of STK600/AVRISPmkII. + +2011-09-14 Joerg Wunsch + + Mega-commit to bring in memory tagging. + Each memory image byte is now tagged as it's being read from a file. + Only bytes read from a file will be written or verified (modulo page + granularity requirements). + * avrpart.h: Add memory tags. + * avrpart.c: Allocate and initialize tag area. + * update.h: Drop unused parameter "verify" from do_op(). + * pgm.h: Add parameter base_addr to the paged_load and paged_write + methods, respectively. + * avr.h: New parameter to avr_read: second AVRPART to verify against. + * fileio.c: Track all memory regions that have been read from an + input file by tagging them. + * update.c: Call avr_read() with the new parameter list. + * main.c: Call avr_initmem() to initialize the memory regions, rather + than trying to duplicate an unitialized part, and then let the + original part rot away. + * avr.c: Implement the heart of the new featureset. For paged memory + areas, when writing or verifying, call the paged_write and paged_load + methods, respectively, once per page instead of on the entire memory. + When writing, only write bytes or pages that have content read from a + file. Whe verifying, only read memory bytes or pages where the + verification data have been read from a file. Only verify those bytes + that have been read from a file. + * avrftdi.c: Implement the new API for paged_load and paged_write, + respectively. + * jtagmkII.c: (Ditto.) + * butterfly.c: (Ditto.) + * jtagmkI.c: (Ditto.) + * avr910.c: (Ditto.) + * stk500.c: (Ditto.) + * usbasp.c: (Ditto.) + * stk500v2.c: (Ditto.) + * usbtiny.c: (Ditto.) + +2011-09-13 Joerg Wunsch + + * stk500v2.c (stk500v2_command): Treat warnings as errors rather than + success. + +2011-08-30 Joerg Wunsch + + bug #34027: avrdude AT90S1200 Problem (part 3 - documentation) + * avrdude.1: Document the programmer type restrictions for AT90S1200 + devices. + * doc/avrdude.texi: (Ditto.) + +2011-08-30 Joerg Wunsch + + bug #34027: avrdude AT90S1200 Problem (part 2 - stk500v2 and relatives) + * stk500v2.c (stk500v2_initialize): For the AT90S1200, release + /RESET for a moment before reinitializing, as this is required by + its programming protocol. + +2011-08-30 Joerg Wunsch + + * configure.ac: In AC_CHECK_LIB for libftdi, check for + ftdi_usb_get_strings() rathern than ftdi_init(), as this is a more + specific thing to search for in order to make sure getting a + recent enough libftdi. + +2011-08-29 Joerg Wunsch + + bug #34027: avrdude AT90S1200 Problem (part 1 - bitbang + programmers) + * config_gram.y: Introduce new keyword "is_at90s1200". + * lexer.l: (Ditto.) + * avrdude.conf.in: Applew new keyword to the AT90S1200 device. + * avrpart.h: Introduce new flag AVRPART_IS_AT90S1200, reflecting + the is_at90s1200 configuration keyword. + * bitbang.c (bitbang_initialize): Replace existing test for + AT90S1200 by AVRPART_IS_AT90S1200 + * avr.c (avr_write_byte_default): Avoid the pre-write reading for + the AT90S1200, as this appears to sometimes corrupt the high byte + by pre-programming the low byte just written into it. + +2011-08-27 Joerg Wunsch + + * configure.ac: Bump version for post-5.11. + +2011-08-27 Joerg Wunsch + + * configure.ac: Bump version for releasing AVRDUDE 5.11. + +2011-08-26 Joerg Wunsch + + * avrdude.1: Update the list of supported AVR devices. + * doc/avrdude.texi: (Ditto). + +2011-08-26 Joerg Wunsch + + * configure.ac: add -lusb as "other libraries" when checking + for libftdi. + +2011-08-26 Joerg Wunsch + + Submitted by Juergen Weigert: + patch #7056: adding support for mikrokopter bootloader to butterfly + * butterfly.c: Add some specific logic to handle the + mikrokopter.de butterfly bootloader. + * butterfly.h: Add one related function declaration. + * config_gram.y: Add butterfly_mk keyword. + * lexer.l: (Ditto.) + * avrdude.conf.in: Add entry for butterfly_mk. + +2011-08-26 Joerg Wunsch + + Submitted by Stefan Tomanek: + patch #7542: add default_bitclock to configuration files + * config.c: Add the new keyword and its handling. + * config.h: (Ditto.) + * config_gram.y: (Ditto.) + * avrdude.conf.in: (Ditto.) + * main.c: (Ditto.) + * lexer.l: (Ditto.) + * avrdude.1: Document the change. + * doc/avrdude.texi: (Ditto.) + +2011-08-26 Joerg Wunsch + + Submitted by Brett Hagman: + patch #7603: wiring - programmer type for Wiring boards + (based on STK500v2) + * wiring.c: New file. + * wiring.h: (Ditto.) + * Makefile.am: Add new files. + * stk500v2_private.h: Reorganize so some functions and struct + pdata are globally known. + * stk500v2.c: (Ditto.) + * stk500v2.h: (Ditto.) + * lexer.l: Add new programmer keywords. + * config_gram.y: (Ditto.) + * avrdude.conf.in: Add "wiring" programmer entry. + * avrdude.1: Document the new programmer. + * doc/avrdude.texi: (Ditto.) + * AUTHORS: Add Brett Hagman. + +2011-08-26 Joerg Wunsch + + Submitted by an anonymous contributor on the mailinglist: + * avrdude.conf (jtagkey): Add a definition for the Amontec + JTAGKey + +2011-08-26 Joerg Wunsch + + Submitted by Juergen Weigert: + bug #22720: avrdude-5.5 ignores buff settings in avrdude.conf + (Note that the actual bug the subject is about has been fixed + long ago.) + * update.c (do_op): fix a diagnostic message + * pgm.h: add exit_datahigh field + * par.c: set and act upon the exit_datahigh field + * avrdude.1: document the new -E options + * doc/avrdude.texi: (Ditto.) + +2011-08-26 Joerg Wunsch + + bug #33811: Parallel make fails + * Makefile.am (BUILT_SOURCES): Add this macro. + +2011-08-26 Joerg Wunsch + + bug #33114: Segfault after setting the DWEN fuse with Dragon + * jtagII.c (jtagmkII_getsync): Instead of exit()ing from + deep within the tree when detecting the "need debugWIRE" + situation, properly pass this up as a return code. + * jtagII_private.h (JTAGII_GETSYNC_FAIL_GRACEFUL): New constant. + * stk500v2.c (stk500v2_jtagmkII_open): Don't tell anything + anymore when receiving a JTAGII_GETSYNC_FAIL_GRACEFUL from + jtagmkII_getsync(); silently give up (all necessary has been + said already). + +2011-08-26 Joerg Wunsch + + Reported by Jason Hecker: + * usbasp.c (libusb_to_errno): Conditionalize some error codes + that apparently are lacking on MinGW. + +2011-08-25 Joerg Wunsch + + Fix warnings. + * ser_avrdoper.c: add so exit() is declared. + * usbtiny.c (usbtiny_open): provide an initializer to a + "may be used uninitialized" variable (since GCC could not + fully detect the logic behind). + +2011-08-25 Joerg Wunsch + + * configure.ac: Add a check for FreeBSD's libusb-1.0 + compatible library that is found in libusb.a/.so on + FreeBSD 8+. + +2011-08-25 Joerg Wunsch + + Submitted by Doug Springer, based on work by + Wolfgang Moser, Ville Voipio, Hannes Weisbach + patch #7486: Patch to add FT2232C/D, FT2232H, FT4232H, + usbvid, usbpid, usbdev for USB support - Based on #7062 + * avrftdi.c: New file. + * avrftdi.h: (Ditto.) + * configure.ac: Add check for libftdi. + * config_gram.y: Add AVRFTDI and per-programmer USB string + keywords. + * lexer.l: (Ditto.) + * avrdude.conf.in: Add avrftdi and 2232HIO programmers. + * pgm.h: Add USB parameters. + * Makefile.am: Add avrftdi.c and avrftdi.h. + * AUTHORS: Mention the new authors. + * avrdude.1: Document the changes. + * doc/avrdude.texi: (Ditto.) + +2011-08-23 Joerg Wunsch + + bug #29585: Fix license + * doc/avrdude.texi: Add FDL as an option to the licensing + statement, as the savannah administration would like it + that way. + +2011-08-23 Joerg Wunsch + + Submitted by Darell Tan: + patch #7244: TPI bitbang implementation + * bitbang.c: Add TPI bitbang stuff. + * bitbang.h: (Ditto.) + * avr.c: (Ditto.) + * avr.h: (Ditto.) + * pgm.c: (Ditto.) + * pgm.h: (Ditto.) + * serbb_posix.c: Wire bitbang_cmd_tpi into the struct pgm. + * serbb_win32.c: (Ditto.) + * par.c: (Ditto.) + * doc/avrdude.texi: Document the TPI bitbang support. + +2011-08-17 Joerg Wunsch + + Submitted by Grygoriy Fuchedzhy: + bug #31779: Add support for addressing usbtinyisp with -P option + * usbtiny.c (usbtiny_open): Add logic to distinguish multiple USBtinyISP + programmers by their bus:device tuple. + * doc/avrdude.texi: Document the new functionality. + * avrdude.1: (Ditto.) + +2011-08-16 Joerg Wunsch + + Submitted by Timon Van Overveldt: + bug #30268: Debugwire broken in avrdude-5.10 + * jtagmkII.c (jtagmkII_initialize): only try setting up a JTAG chain when + the programmer is using JTAG. + +2011-08-16 Joerg Wunsch + + bug #29636: AVRDude issues invalid CMD_CHECK_TARGET_CONNECTION + on the AVRISP-MKII + * stk500v2.c (stk500v2_program_enable): Rewrite the logic to + explain ISP activation failures. + * stk500v2_private.h: Fix the various STATUS_* constants; + AVR069 and AVR079 disagreed in their values, even though they + are apparently implementing the same logic behind. + +2011-08-16 Joerg Wunsch + + bug #29650: Programming timeouts in ATmega128RFA1 are too slow + * avrdude.conf.in (ATmega128RFA1): Bump write delay values for flash and + EEPROM to 50 ms. + +2011-08-16 Joerg Wunsch + + * avrdude.conf.in (ATmega8515, ATmega8535, ATmega48, ATmega88, ATmega88P, + ATtiny88, ATmega168, ATmega168P, ATmega328P): Bump delay value for STK500v2 + EEPROM write operation to 5, according to the respective XML files. + +2011-08-16 Joerg Wunsch + + Submitted by Darcy Houlahan: + bug #29694: error in avrdude.conf for attiny84 eeprom + * avrdude.conf.in (ATtiny84, ATtiny85): fix A7 bit in EEPROM write + command. + +2011-08-16 Joerg Wunsch + + Submitted by Durant Gilles: + * avrdude.conf.in (ATtiny4313): Fix flash addressing bits for manual ISP + algorithm. + +2011-08-16 Joerg Wunsch + + Submitted by Philip: + bug #31386: A "BUILD.svn" or similar "how to get started" doc would be helpful + * BUILD-FROM-SVN: New file. + +2011-08-15 Joerg Wunsch + + Submitted by Nic Jones: + bug #32539: [Documentation][Patch] Man page is misleading + re: Dragon & PDI + * doc/avrdude.texi: Update information about PDI connections + on AVR Dragon + +2011-08-12 Joerg Wunsch + + * usbasp.c: Add so this actually compiles + again. + +2011-08-12 Joerg Wunsch + + Contributed by tixiv@gmx.net: + bug #33345: File auto detection as binary doesn't open + file in binary mode on Windows + * fileio.c: Move the decision about opening files in + binary mode until before the fopen() call. + +2011-06-16 Thomas Fischl + + * avrdude.conf.in: Fix part id of ATtiny9. + +2011-05-28 Thomas Fischl + + Based on patch #7440 commited by Slawomir Fraś: + * usbasp.c: added TPI support for USBasp + * usbasp.h: (Ditto.) + +2011-05-11 Joerg Wunsch + + * avrdude.conf.in: Add support for ATmega168P. + +2011-05-11 Joerg Wunsch + + * avrdude.conf.in: Fix abbreviated name for ATmega324PA. + +2011-05-11 Joerg Wunsch + + Submitted by Lech Perczak: + bug #30946: Added support for ATmega8/16/32U2 + * avrdude.conf.in: Add ATmega8/16/32U2 entries. + +2011-05-11 Joerg Wunsch + + Submitted by David A Lyons: + patch #7393: Adding ATtiny4313 Device to avrdude.conf.in + * avrdude.conf.in: Add ATtiny4313 data. + +2011-05-11 Joerg Wunsch + + * usb_libusb.c: Bump timeout values to allow for slow clock + speeds. + * jtagmkII.c: (Ditto.) + +2011-03-04 Eric B. Weddington + + Thanks to Vitaly Chernookiy for the patch. + * avrdude.conf.in: Add support for atmega324pa. + * ChangeLog-2010: New file, rotate ChangeLog for new year. diff --git a/xs/src/avrdude/ChangeLog-2012 b/xs/src/avrdude/ChangeLog-2012 new file mode 100644 index 000000000..bb5751a6d --- /dev/null +++ b/xs/src/avrdude/ChangeLog-2012 @@ -0,0 +1,729 @@ +2012-12-18 Joerg Wunsch + + * usbdefs.h (USBDEV_BULK_EP_WRITE_STK600) + (USBDEV_BULK_EP_READ_STK600): new define values + * stk500v2.c (stk600_open): use the STK600 EP values, + as they are different from AVRISPmkII + +2012-12-18 Joerg Wunsch + + bug #37942: Latest SVN can't program in dragon_jtag mode + * jtagmkII.c (jtagmkII_initialize): For Xmega devices, and + firmware >= 7.x, don't trigger a RESET, in order to work around a + firmware bug that appears to be present in at least firmware 7.24 + for the Dragon. + +2012-12-04 Joerg Wunsch + + * config_gram.y: Implement the "ocdrev" keyword + * avrpart.c: (Dito) + * avrpart.h: (Dito) + * lexer.l: (Dito) + * avrdude.conf.in: Add "ocdrev" key/value pairs, based + on the AS6 XML file information. + * jtag3.c: Use the ocdrev in the parameter block. + +2012-12-03 Joerg Wunsch + + * jtag3.c: Make jtag3_command() public + * jtag3.h: (Dito.) + * jtag3_private.h: Add two new commands + * stk500v2.c: Implement the "MonCon disable" hack that + allows temporarily falling back to ISP when trying to + talk to a part that has debugWIRE enabled + +2012-12-03 Rene Liebscher + + * pickit2.c: reordered #includes for non-usb configuration + +2012-12-03 Joerg Wunsch + + * jtag3.c: Enable interactive adjustment of the various + clock frequencies (JTAG Xmega, JTAG megaAVR, PDI Xmega) + through the set_sck_period() callback. + +2012-12-03 Joerg Wunsch + + * jtag3.c: Remove unused code that was left over from + cloning the jtagmkII.c implementation + +2012-12-03 Joerg Wunsch + + * pgm_type.c: Add "jtagice3_isp" programmer hook + * avrdude.conf.in: Add "jtag3isp" programmer + * jtag3.c: jtag3_setparm() is now public + * jtag3.h: (Dito) + * stk500v2_private.h: Command 0x1D is CMD_SPI_MULTI only + for STK500v2, AVRISPmkII, and JTAGICEmkII; for JTAGICE3, + it's CMD_SET_SCK now; also add CMD_GET_SCK + * avrpart.c (avr_get_output_index): New function + * avrpart.h: (Dito) + * stk500v2.c: Implement the pasthrough programmer glue logic + for JTAGICE3 in ISP mode + * stk500v2.h: (Dito) + * avrdude.1: Document the JTAGICE3 support. + +2012-11-30 Joerg Wunsch + + * jtag3.c (jtag3_read_byte, jtag3_write_byte): Remove the + m->offset from addr, JTAGICE3 doesn't need it anymore (similar + to JTAGICEmkII with 7+ firmware) + * jtag3.c (jtag3_read_byte): Allow for full-page reads of + EEPROM also for Xmega and debugWIRE, allow for signature + read in debugWIRE + +2012-11-30 Joerg Wunsch + + * jtag3_private.h: Add two more error detail codes I stumbled + across during development + * jtag3.c: (Dito.) + * usb_libusb.c: Reduce timeouts from 100 to 10 s, still long + enough, but not getting cold feet when something goes wrong. + +2012-11-29 Joerg Wunsch + + * jtag3.c: Handle events returned by the ICE + * usbdevs.h: Add defines that mark an event in return + from usb_recv_frame(). + * usb_libusb.c: (Dito.) + +2012-11-29 Joerg Wunsch + + * avrdude.conf.in: Remove "has_jtag" from Xmega A4 and D4 + devices, as they only have PDI. + * jtag3.c (jtag3_page_erase): Actually implement this. + +2012-11-29 Joerg Wunsch + + bug #37265: wrong page sizes for XMega64xx in avrdude.conf + * avrdude.conf.in: Fix page sizes for all Xmega devices, + by cross-checking against Atmel Studio's device XML files + +2012-11-29 Joerg Wunsch + + * jtag3.c: Fill in the missing pieces for Xmega support (both, + PDI and JTAG). + * jtagmkII.c (jtagmkII_set_xmega_params): Use "fuse1" rather + than "fuse0" memory space to fill in the NVM offset from, as + there is no "fuse0" on some Xmega devices. + +2012-11-29 Joerg Wunsch + + * avrdude.conf.in (ATmega256RFR2, ATmega128RFR2, ATmega64RFR2): + New devices + +2012-11-28 Joerg Wunsch + + First support for Atmel JTAGICE3. Guessed from USB sniffer + traces made by Knut Schwichtenberg, and by similarity to + JTAGICEmkII. + Still quite incomplete, just megaAVR/JTAG is done by now. + * jtag3.c: New file. + * jtag3.h: (Dito.) + * jtag3_private.h: (Dito.) + * pgm_type.c: Add new programmers + * avrdude.conf.in: (Dito.) + * usbdevs.h: Add new parameters + * Makefile.am: Add new files + * usb_libusb.c: Handle separate event endpoint, and larger + (USB 2.0) packet sizes + +2012-11-26 Joerg Wunsch + + * jtagmkII.c: Change all the USB details (endpoint numbers, + max transfer size etc.) to a per-programmer adjustable value. + * serial.h: (Dito.) + * stk500v2.c: (Dito.) + * usbdevs.h: (Dito.) + * usb_libusb.c: (Dito.) + +2012-11-20 Joerg Wunsch + + * buspirate.c: Replace outdated FSF postal address by a reference to + the GPL info on their website. + * jtagmkII.c: (Dito.) + * avrftdi.c: (Dito.) + * wiring.c: (Dito.) + * linux_ppdev.h: (Dito.) + * serbb.h: (Dito.) + * usbtiny.h: (Dito.) + * confwin.c: (Dito.) + * buspirate.h: (Dito.) + * avrftdi.h: (Dito.) + * wiring.h: (Dito.) + * jtagmkII.h: (Dito.) + * pickit2.c: (Dito.) + * config.c: (Dito.) + * term.c: (Dito.) + * confwin.h: (Dito.) + * avrdude.1: (Dito.) + * windows/Makefile.am: (Dito.) + * config.h: (Dito.) + * pickit2.h: (Dito.) + * term.h: (Dito.) + * tools/get-hv-params.xsl: (Dito.) + * tools/get-stk600-cards.xsl: (Dito.) + * tools/get-stk600-devices.xsl: (Dito.) + * tools/get-dw-params.xsl: (Dito.) + * butterfly.c: (Dito.) + * configure.ac: (Dito.) + * doc/Makefile.am: (Dito.) + * pgm_type.c: (Dito.) + * butterfly.h: (Dito.) + * jtagmkI.c: (Dito.) + * ft245r.c: (Dito.) + * COPYING: (Dito.) + * pgm_type.h: (Dito.) + * jtagmkI.h: (Dito.) + * pindefs.h: (Dito.) + * config_gram.y: (Dito.) + * arduino.c: (Dito.) + * arduino.h: (Dito.) + * ser_win32.c: (Dito.) + * serbb_win32.c: (Dito.) + * avr910.c: (Dito.) + * stk500.c: (Dito.) + * freebsd_ppi.h: (Dito.) + * avr910.h: (Dito.) + * solaris_ecpp.h: (Dito.) + * stk500.h: (Dito.) + * jtagmkII_private.h: (Dito.) + * avrdude.h: (Dito.) + * bitbang.c: (Dito.) + * bitbang.h: (Dito.) + * avrpart.c: (Dito.) + * safemode.c: (Dito.) + * stk500generic.c: (Dito.) + * serial.h: (Dito.) + * avrpart.h: (Dito.) + * jtagmkI_private.h: (Dito.) + * ppi.c: (Dito.) + * avr.c: (Dito.) + * safemode.h: (Dito.) + * stk500generic.h: (Dito.) + * ser_avrdoper.c: (Dito.) + * avr.h: (Dito.) + * ppi.h: (Dito.) + * usbasp.c: (Dito.) + * lists.c: (Dito.) + * stk500v2.c: (Dito.) + * my_ddk_hidsdi.h: (Dito.) + * tpi.h: (Dito.) + * usbasp.h: (Dito.) + * lists.h: (Dito.) + * stk500v2.h: (Dito.) + * ppiwin.c: (Dito.) + * fileio.c: (Dito.) + * ser_posix.c: (Dito.) + * fileio.h: (Dito.) + * serbb_posix.c: (Dito.) + * usbdevs.h: (Dito.) + * par.c: (Dito.) + * update.c: (Dito.) + * pgm.c: (Dito.) + * main.c: (Dito.) + * par.h: (Dito.) + * update.h: (Dito.) + * lexer.l: (Dito.) + * Makefile.am: (Dito.) + * pgm.h: (Dito.) + * usb_libusb.c: (Dito.) + * usbtiny.c: (Dito.) + +2012-11-13 Rene Liebscher + + bug #35186 inverting pins with "~" doesn't work for pin lists (i.e. vcc) + bug #37727 Add support for LM3S811 dev board as a programmer + * lexer.l,config_gram.y: accepting inverted pins at pin lists + syntax: ~num or ~(num,num,...) + * par.c: par_set_many_bits is now usable with inverted pins + * avrftdi.c: fixed wrong index in ftdi_pin_name + * avrdude.conf.in: added programmer lm3s811 + +2012-11-04 Rene Liebscher + + * lexer.l,config_gram.y,config.[hc]: changed reading of numbers to integers + except of default_bitclock which is the only real number. + No signs are allowed as negative values do not make sense for current + config values. + * buspirate.c: include own header file buspirate.h + * doc/.cvsignore: add programmers.texi to ignore list + +2012-09-06 Joerg Wunsch + + * doc/Makefile.am: add EXTRA_DIST, replace $(srcdir) by + $(builddir) for generated files, so "make distcheck" + works again + +2012-09-05 Rene Liebscher + + * doc/Makefile.am: add $(srcdir) to name of generated files, so BSD make + find the files ( GNU make sees no difference if the + file is called version.texi or ./version.texi ) + +2012-08-15 Rene Liebscher + + patch #7184 Support for PICKit2 programmer + * Makefile.am: add pickit2 files + * pickit2.[ch]: new programmer implementation + * pgm_type.c: add pickit to list + * avrdude.1: documentation for pickit2 + * doc/avrdude.texi: documentation for pickit2 + * avrdude.conf.in: add pickit2 programmer entry + +2012-08-15 Rene Liebscher + + bug #30559 Ft232 bit-bang support, see comment #30 + * ft245r.c: added semaphore workaround for MacOS X, + added pthread_testcancel in reader thread + + * configure.ac: added check for TYPE_232H in libftdi (not in libftdi < 0.20) + * avrftdi.c: do not use TYPE_232H if not declared + +2012-08-13 Hannes Weisbach + + * avrftdi.c: fixes pin_limit for different FTDI devices (there was a mixup + between 2232C and 2232H) + +2012-07-29 Hannes Weisbach + + * avrftdi.c: bugfixes (synchronisation) and maintenance (paged programming, + nicer output, separation of parameter checking and actual code) + +2012-07-25 Joerg Wunsch + + * jtagmkII.c (jtagmkII_memtype): return MTYPE_FLASH rather than + MTYPE_SPM for non-Xmega flash regions + +2012-07-20 Hannes Weisbach + + * avrpart.c, avrpart.h: adds avr_pin_name() + +2012-07-18 Joerg Wunsch + + * configure.ac: check for libelf.h also in libelf/ + * fileio.c: include if configure found this + to be the case + +2012-06-13 Rene Liebscher + + * configure.ac: Check for presence of + * ft245r.c: Depend on HAVE_PTHREAD_H + * Makefile.am: Add -lpthread if needed. + +2012-06-07 Joerg Wunsch + + * usbtiny.c (usbtiny_paged_load, usbtiny_paged_write): + fix breakage introduced by the recent page handling reorg; + it used to cause an infinite loop + +2012-05-04 Joerg Wunsch + + Xmega page erase implementation for XPROG (AVRISPmkII, STK600) + * stk500v2.c (stk600_xprog_page_erase): New function. + +2012-05-04 Joerg Wunsch + + Xmega page erase implementation for JTAGICEmkII + * jtagmkII.c: Handle flash pages sizes > 256 bytes, implement + page_erase() method + * avrdude.conf.in: Change flash pagesize for all Xmega devices + to 512 bytes + * avr.c: Implement auto_erase, using page_erase if available + * avr.h: Remove unused parameters from avr_read(), replace + unused parameter in avr_write)() by auto_erase + * stk500v2.c: Handle flash page sizes > 256 bytes + * update.c (do_op): Handle new updateflags parameter + * main.c: Implement auto_erase as page_erase if possible + * update.h (enum updateflags): New enum + * pgm.h (struct programmer_t): Add page_erase method + +2012-04-26 Joerg Wunsch + + * jtagmkII.c (jtagmkII_paged_load, jtagmkII_paged_write): fix bug + in memory type calculation for Xmega "boot" memory region. + +2012-04-25 Joerg Wunsch + + * update.c (parse_op): do not assume default memtype here + * main.c: after locating the part information, determine default + memtype for all update options that didn't have a memtype + specified; this is "application" for Xmega parts, and "flash" for + everything else. + +2012-04-24 Joerg Wunsch + + * fileio.c: Rework the way ELF file sections are considered: while + scanning the program header table, the offsets from a program + header entry must never be used directly when checking the bounds + of the current AVR memory region. Instead, they must always be + checked based on the corresponding section's entry. That way, + Xmega devices now properly take into account whether the segment + fits into any of the application/apptable/boot memory region. + +2012-04-20 Joerg Wunsch + + bug #30756: When setting SUT to 64ms on XMEGA, avrdude doesn't + read device signature + * main.c: When reading the signature yields 0x000000 or 0xffffff, + retry (up to twice) after some progressive delay. + +2012-04-20 Joerg Wunsch + + * avrdude.conf.in (ATxmega16D4, ATxmega32D4, ATxmega64D4, + ATxmega128D4): New devices. As Xmega D doesn't feature a fuse0 + memory cell, move that one out from the generic .xmega part into + the individual Xmega A parts. + +2012-04-19 Joerg Wunsch + + bug #29019: pagel/bs2 warning when uploading using stk500 to xmega + * stk500.c (stk500_initialize): Insert dummy values for PAGEL and + BS2 if they are not present in the config file, in order to be able + to proceed with the stk500_set_extended_parms() anyway. + +2012-04-19 Joerg Wunsch + + * stk500v2_private.h (struct pdata): add boot_start + * stk500v2.c: For the "flash" pseudo-memory of Xmega devices, + distinguish addresses between "application" and "boot" area. + +2012-04-18 Joerg Wunsch + + * fileio.c (elf2b): When checking the bounds of the current + program header segment, subtract `low' from ph[n].p_paddr in order + to correct the magic section offsets for the AVR's non-flash + memory regions. + +2012-04-18 Joerg Wunsch + + * fileio.c (elf_get_scn): Rather than trying to just match whether + any given section maps straight to a program header segment, use a + more sophisticated decision that matches any section as long as it + fits into the segment. This is needed for situations where the + program header segment spans a larger area than the section data + provided. (This can e.g. happen in an ELF file that contains no + data at address 0, like a bootloader only.) + +2012-04-13 Joerg Wunsch + + bug #28744: Can't load bootloader to xmega128a1 (part 2, fix for + firmware >= V7.x) + * jtagmkII.c: Add firmware-version dependent handling of Xmega parameters. + V7.x firmware expects the NVM offsets being specified through the Xmega + parameters command, but left out as part of the memory address itself. + * jtagmkII_private.h: Add CMND_SET_XMEGA_PARAMS, and struct xmega_device_desc. + * config_gram.y: Add mcu_base keyword. + * avrpart.h: (Dito.) + * lexer.l: (Dito.) + * avrdude.conf.in (.xmega): add mcu_base, and data memory segment. + +2012-03-30 Joerg Wunsch + + bug #28744: Can't load bootloader to xmega128a1 (part 1, fix for + firmware < V7.x) + * jtagmkII.c: When going to write to the boot section of flash, + use MTYPE_BOOT_FLASH rather than MTYPE_FLASH + * jtagmkII_private.h: add MTYPE_BOOT_FLASH constant + +2012-03-30 Joerg Wunsch + + * jtagmkII_private.h: Sort commands, response codes and events + into numerical order. + +2012-03-29 Joerg Wunsch + + bug #30451: Accessing some Xmega memory sections gives not + supported error + * stk500v2.c: Handle all Xmega memory sections (except + "prodsig" which is not documented in AVR079) + * fileio.c: Treat the "boot", "application", and "apptable" + regions (which are actually subregions of "flash") all as + being flash, i.e. suppress trailing 0xFF bytes when reading + them + * avr.c: (Dito.) + +2012-03-20 Joerg Wunsch + + * jtagmkII.c (jtagmkII_close): The GO command before signing off + turned out to be not required for normal megaAVR devices, and to + cause the exact opposite (i.e. the target stopping) on Xmega + devices being programmed to JTAG. However, programming Xmega + devcies through PDI *does* need the GO command. + +2012-03-20 Joerg Wunsch + + * configure.ac: Print a configuration summary at the end of the + configure run + +2012-02-11 Rene Liebscher + + patch #7718: Merge global data of avrftdi in a private data structure + * avrftdi.[ch]: moved global data into private data structure, moved + private defines from header file into source file + +2012-02-06 Rene Liebscher + + patch #7720 Bug in EEPROM write + * avrftdi.c: fixed wrong buffer address initialization in paged_write + * fileio.c: added #include + +2012-02-05 Rene Liebscher + + bug #30559 Ft232 bit-bang support + * ft245r.c: cancel reader thread before exiting program + +2012-02-04 Rene Liebscher + + patch #7717 avrftdi_flash_write is broken + * avrftdi.c: fixed wrong buffer address initialization in paged_write + bug #35296 Extraneous newlines in output. + * main.c: fixed output of newlines at 100% progress + +2012-02-03 Rene Liebscher + + patch #7715 FT4232H support + * avrdude.conf.in: added programmer 4232h + +2012-02-03 Rene Liebscher + + patch #7687: Autogenerating programmers and parts lists for docs + (generating the programmers lists) + * doc/avrdude.texi: Add include of generated table of programmers + * doc/Makefile.am: Add generating of table of programmers in programmers.texi + +2012-02-03 Rene Liebscher + + bug #34768 Proposition: Change the name of the AVR32 devices + * avrdude.conf.in: renamed ucr2 to uc3a0512 + * avrpart.c: added cast to avoid compiler warning + +2012-02-03 Joerg Wunsch + + * fileio.c (fileio_elf): Fix a copy'n-paste-o. + +2012-02-03 Joerg Wunsch + + * par.c (par_desc): Move to end of file, outside the #if + HAVE_PARPORT + +2012-02-02 Joerg Wunsch + + Implement ELF file reading (finally). Requires libelf(3) to be + present on the host system. + * configure.ac (HAVE_LIBELF): Add logic to detect presence of + libelf(3) + * Makefile.am (avrdude_LDADD): Add @LIBELF@ + * fileio.h (FILEFMT): add FMT_ELF + * fileio.c: Implement ELF file reader. + * update.c (parse_op): add 'e' format specifier + * avrdude.1: Document the ELF file reading capability + * doc/avrdude.texi: (Dito.) + +2012-02-01 Rene Liebscher + + bug #30559 Ft232 bit-bang support + * ft245r.[ch]: new programmer type implementation + * configure.ac: add pthread as link library + * avrdude.conf.in: added some new programmers + * Makefile.am: added new source files to compile + * pindefs.h: change PIN_MASK, PIN_INVERSE to highest bit of unsigned int + * pgm.[ch]: added generic function to print pin assignments (taken from par.c) + * par.c: moved pin assigment print function to pgm.c + +2012-02-01 Joerg Wunsch + + * lexer.l: Sort keyword tokens into alphabetic order. + +2012-01-31 Rene Liebscher + + * config_gram.y, lexer.l: removed unused ID/TKN_ID definitions + * config.[hc]: removed unused function id(), use value.type to select + values + +2012-01-31 Rene Liebscher + + patch #7437 modifications to Bus Pirate module + patch #7686 Updating buspirate ascii mode to current firmware, use AUX + as clock generator, and setting of serial receive timeout + * buspirate.c: added paged_write, changed binary mode setup/detection, + added clock output on AUX pin + * avrdude.1: updated documentation + * doc/avrdude.texi: updated documentation + +2012-01-31 Rene Liebscher + + Parser does not need to know all programmer types now, new programmers + will update only the table in pgm_type.c. + * config_gram.y, lexer.l: removed programmer type keywords, + use now locate_programmer_type() function + * pgm_type.[ch]: added new files for table of programmer types + * main.c: allow list of programmer types by -c ?type + * avrdude.conf.in: changed all type keywords to quoted strings + * doc/avrdude.texi: changed description of type definition, list + of valid types is now included from generated file + * doc/Makefile.am: generate list of programmer types for doc + * all programmers [hc]: add xxx_desc string for description of programmer + +2012-01-30 Rene Liebscher + + * configure.ac: fixed detection of yylex_destroy availability + by checking the version number of flex; bump required autoconf + version to 2.60 (for AC_PROG_SED) + +2012-01-30 Joerg Wunsch + + * lexer.l: Replace the old, now-defunct #define YY_NO_UNPUT by + the new %option nounput. This gets rid of a compiler warning. + +2012-01-30 Joerg Wunsch + + Add a connection_type attribute to each programmer, rather than + trying to hard-code the default port name in main.c. + * pgm.h: Add conntype to struct pgm. + * lexer.l: Extend grammar for connection_type. + * config_gram.y: (Dito.) + * config.h: Add DEFAULT_USB, for symmetry with default_parallel + and default_serial. + * main.c: Replace old default portname hack by avrdude.conf-based + knowledge. + * usbtiny.c: Drop an old hack that's no longer necessary. + * avrdude.conf.in: Add connection_type to each programmer + definition. + +2012-01-27 Rene Liebscher + + * avrdude.conf.in: used parent parts for some other parts, added + abstract .xmega part as parent for xmegas + * main.c: hide parts starting with '.' from parts list + +2012-01-22 Rene Liebscher + + patch #7688: Implement parent programmers feature + * avrdude.conf.in: updated documentation comment and some programmers + have now parents + * config_gram.y: initpgm will now called at first use of programmer + in main. parser sets only the function pointer in the pgm structure. + Pin and pin lists definitions can now be empty to remove the parents + setting. + * doc/avrdude.texi: updated documentation + * main.c: added call to pgm->initpgm after locate_programmer + * pgm.[hc]: added field initpgm in structure, added function pgm_dup + +2012-01-21 Rene Liebscher + + bug #21797: AT90PWM316: New part description + * avrdude.conf.in: added pwm316 with parent pwm3b but 16KB flash + +2012-01-20 Joerg Wunsch + + * configure.ac: Check for presence of lusb_usb.h as an alternative + to usb.h; libusb-win32 switched to this name in version 1.2.5.0. + * avrftdi.c: Decide whether to include , or . + * ser_avrdoper.c: (Dito.) + * usbasp.c: (Dito.) + * usb_libusb.c: (Dito.) + * usbtiny.c: (Dito.) + +2012-01-19 Rene Liebscher + + * avr.c: Unsigned variable was used for return code of paged_write/load + functions. So a negative return code led never to a fallback to byte + functions. + +2012-01-17 Rene Liebscher + + bug #34302: Feature request : device configuration with parent classes + * config_gram.y: if memory section is overwritten old entry is removed + + (not in original patch) + * config_gram.y: if programmer or part is defined twice, a warning is + output and the first instance is removed + + General cleanup and free functions, so valgrind does not report any lost + blocks at program end. + * avrpart.[hc]: added avr_free_(opcode|mem|part) functions + * pgm.[hc]: added pgm_free function + * update.[hc]: added free_update functions + * config.[hc]: added cleanup_config function, use yylex_destroy to reset + the lexer after usage. (So it can be reused.) + * main.c: add cleanup_main function which is called by atexit() (This + frees all lists so that at program exit only really lost memory is + reported by valgrind.) + * usbasp.c: added libusb_free_device_list() and libusb_exit() calls to + avoid lost memory + * buspirate.c: moved memory allocation from initpgm to setup and added + free in teardown + * configure.ac: add definition of HAVE_YYLEX_DESTROY if $LEX is flex. + * Makefile.am: added . in front of SUBDIRS to build avrdude before trying + to use it for creating the part list for the docs. + +2012-01-17 Rene Liebscher + + * usbasp.c: USB vid/pid/vendor/product from config file are used, for + id "usbasp" nibobee and old usbasp are tried as they were currently + implemented within usbasp + * avrdude.conf.in: added usb params to "usbasp", added new entry "nibobee" + with params which were hardcoded in usbasp.c, and added an entry + "usbasb-clone" which only checks vid/pid. + +2012-01-10 Rene Liebscher + + bug #35261 avrftdi uses wrong interface in avrftdi_paged_(write|load) + * avrftdi.c: Fixed interface and implementation of avrftdi_paged_(write|load) + patch #7672 adding support for O-Link (FTDI based JTAG) as programmer + * avrdude.conf.in: added o-link entry + +2012-01-10 Rene Liebscher + + patch #7699 Read additional config files + * main.c: Added reading of additional config files + * avrdude.1: updated man page + * doc/avrdude.texi: updated documentation + +2012-01-10 Joerg Wunsch + + Submitted by Bob Frazier: + bug #35208: avrdude 5.11 on freebsd 8.2-STABLE does not reset + Arduino Uno properly + * arduino.c (arduino_open): Bump the timeout between pulling + the DTR and RTS lines low and high. + +2012-01-08 Rene Liebscher + + Fixed following findings reported by cppcheck + * avr910.c:625 (error) Possible null pointer dereference: cmd - otherwise it is redundant to check if cmd is null at line 624 + * avr910.c:626 (error) Possible null pointer dereference: cmd - otherwise it is redundant to check if cmd is null at line 624 + * avr910.c:168 (information) The scope of the variable 'devtype_1st' can be reduced + * avr910.c:169 (information) The scope of the variable 'dev_supported' can be reduced + * avrftdi.c:647 (error) Using sizeof for array given as function argument returns the size of pointer. + * stk500v2.c:3347 (error) Memory leak: b + * stk500v2.c:3452 (error) Memory leak: b + * usbasp.c:554 (error) Using sizeof for array given as function argument returns the size of pointer. + * usbasp.c:485 (information) The scope of the variable 'dly' can be reduced + +2012-01-03 Joerg Wunsch + + Reported by Jason Kotzin: + * usbasp.c (usbasp_spi_paged_load, usbasp_spi_paged_write): + Fix buffer address calculation. + +2012-01-03 Rene Liebscher + + patch #7629 add support for atmega48p + * avrdude.conf.in: Added m48p with parent m48 + different signature + + * avrdude.conf.in: made part parents (m88p = m88 + different signature, + m168p = m168 + different signature) + +2012-01-02 Rene Liebscher + + bug #21663 AT90PWM efuse incorrect + bug #30438 efuse bits written as 0 on at90pwmxx parts + * avrdude.conf.in: (pwm2, pwm2b, pwm3, pwm3b) : Write + eight bits + + * avrdude.conf.in: made part parents (pwm3 = pwm2, pwm3b = pwm2b, + pwm2b = pwm2 + different signature) + + * ChangeLog-2011: New file, rotate ChangeLog for new year. diff --git a/xs/src/avrdude/ChangeLog-2013 b/xs/src/avrdude/ChangeLog-2013 new file mode 100644 index 000000000..8e975ef6e --- /dev/null +++ b/xs/src/avrdude/ChangeLog-2013 @@ -0,0 +1,618 @@ +2013-12-15 Nils Springob + + * pgm.c/pgm.h: fixed syntax error in const pointer to const + +2013-12-05 Joerg Wunsch + + * configure.ac: bump version to 6.1-svn-20131205 + +2013-12-05 Joerg Wunsch + + bug #40817: Elf file support (possibly) not working on 6.0.1 windows build + * fileio.c (fileio): open file in binary mode also for FMT_ELF + +2013-12-04 Rene Liebscher + + Rework of bitbanging functions setpin, getpin, highpulsepin to make simplier use + of new pindefs data in pgm structure + * linuxgpio.c, bitbang.c, buspirate.c, par.c, pgm.h, term.c, serbb_*.c: changed + interface of setpin, getpin, highpulsepin to take pin function as parameter + (not the real number, which can be found by pgm->pinno[function]) + +2013-11-30 Rene Liebscher + + bug #40748 linuxgpio doesn't work on Raspberry PI rev. 2. + * linuxgpio.c: fixed check for unused pins to ignore the inverse flag + * pindefs.c: fixed fill_old_pinlist to not create an empty mask with inverse flag set + +2013-10-18 Nils Springob + + * avrdude.conf.in (atmega1284): ATmega1284 variant added (same as ATmega1284p but with different signature) + +2013-09-25 Hannes Weisbach + + First part of patch #7720: + * avrdude.conf.in: Add UM232H and C232H programmers + +2013-09-22 Joerg Wunsch + + Submitted by Daniel Rozsnyo: + bug #40085: Typo fix in fuses report (for 6.1-svn-20130917) + * main.c: Fix a typo. + +2013-09-19 Hannes Weisbach + + task #12798: Please cleanup #ifdef notyet entries in avrftdi.c + * avrftdi.c: ditto. + avrftdi.c: Remove DRYRUN-option. + +2013-09-17 Joerg Wunsch + + bug #40055: AVRDUDE segfaults when writing eeprom + * main.c: Always clear the UF_AUTO_ERASE flag if either a + non-Xmega device was found, or the programmer does not offer a + page_erase method. + +2013-09-17 Joerg Wunsch + + * configure.ac (AC_INIT): Bump version to post-6.0. + +2013-09-17 Joerg Wunsch + + * configure.ac (AC_INIT): Bump version to 6.0. + +2013-09-17 Joerg Wunsch + + * jtag3.c (jtag3_initialize): Fix a buffer overflow by limiting + the flash page cache size to at most "readsize". For Xmegas with + a page size of 512 bytes, the maximum USB packet size was + overflowed, and subsequently, a memmove copied beyond the end of + the allocated buffer. + * jtag3.c (jtag3_read_byte): Add the correct offset also for the + various flash regions, so reading the apptable or boot regions + yields the correct data. + +2013-09-16 Joerg Wunsch + + Submitted by Joakim Lubeck: + bug #40040: Support for ATtiny20 and ATtiny40 + * avrdude.conf.in: Restructure the reduced-core tiny devices + to use a common entry .reduced_core_tiny; add ATtiny20 and + ATtiny40 + +2013-09-15 Joerg Wunsch + + Submitted by Joakim Lubeck: + bug #40033: Support for the XMegaE5 family + * avrdude.conf.in (ATxmega8E5, ATxmega16E5, ATxmega32E5): New + entries. + +2013-09-13 Joerg Wunsch + + * stk500v2.c (stk500v2_set_sck_period): Revamp this to match the + description/pseudo-code in appnote AVR068. + +2013-09-13 Joerg Wunsch + + Submitted by Stephen Roe: + patch #7710: usb_libusb: Check VID/PID before opening device + * usb_libusb.c (usbdev_open): Swap the sequence of verifying the + VID:PID, and opening the device. + +2013-09-13 Joerg Wunsch + + patch #8176: butterfly.c (AVR109 protocol implementation) clean-up and bug-fixing + * butterfly.c (butterfly_page_erase): Add dummy function to avoid + segfault when writing to EEPROM. + +2013-09-13 Joerg Wunsch + + bug #35474 Feature request: print fuse values in safemode output + * config_gram.y: New configuration token "default_safemode". + * lexer.l: (Dito.) + * avrdude.conf.in: (Dito.) + * config.h: Add variable default_safemode. + * config.c: (Dito.) + * main.c: Handle default_safemode, including -u option. + * avrdude.1: Document all this. + * doc/avrdude.texi: (Dito.) + +2013-09-13 Joerg Wunsch + + Submitted by HubertB: + patch #7657 Add ATmega406 support for avrdude using DRAGON + JTAG + * avrdude.conf.in (ATmega406): New entry. + +2013-09-13 Joerg Wunsch + + Submitted by Marc de Hoop: + patch #7606 ATtiny43u support + * avrdude.conf.in (ATtiny43U): New entry. + +2013-09-13 Joerg Wunsch + + patch #5708 avrdude should make 10 synchronization attempts instead of just one + * stk500.c (stk500_getsync): Loop 10 times trying to get in + sync with the programmer. + +2013-09-13 Joerg Wunsch + + Contributed by Ricardo Martins: + bug #36384 ATxmega32A4 usersig size + * avrdude.conf.in: Revamp all the ATxmega* entries. Add new + entries for ATxmega128A1U, ATxmega128A3U, ATxmega128A4U, + ATxmega128B1, ATxmega128B3, ATxmega128C3, ATxmega128D3, + ATxmega16A4U, ATxmega16C4, ATxmega192A3U, ATxmega192C3, + ATxmega192D3, ATxmega256A3BU, ATxmega256A3U, ATxmega256C3, + ATxmega256D3, ATxmega32A4U, ATxmega32C4, ATxmega384C3, + ATxmega384D3, ATxmega64A1U, ATxmega64A3U, ATxmega64A4U, + ATxmega64B1, ATxmega64B3, ATxmega64C3, ATxmega64D3 + +2013-09-13 Joerg Wunsch + + bug #35456 The progress bar for STK500V2 programmer is "wrong". + * avr.c (avr_read, avr_write): Change the progress reporting for + paged read/write from per-address to per-considered-page. This + ought to give a realistic estimation about the time still to be + spent. + +2013-09-13 Joerg Wunsch + + bug #34277: avrdude reads wrong byte order if using avr911 (aka butterfly) + * butterfly.c (butterfly_read_byte_flash): Swap bytes received. + +2013-09-12 Joerg Wunsch + + bug #37768 Poll usbtiny 100 times at init time to handle low-clock devices + * doc/avrdude.texi: Add a FAQ entry about how to connect to a + target where the firmware has reduced the internal clock speed. + +2013-09-11 Joerg Wunsch + + bug #28344 chip_erase_delay too short for ATmega324P, 644, 644P, and 1284P + * avrdude.conf: Bump the chip_erase_delay for all ATmega*4 devices + to 55 ms. While the datasheet still claims 9 ms, all the XML files + tell either 45 or 55 ms, depending on STK600 or not. + +2013-09-11 Joerg Wunsch + + * fileio.c (fileio): Don't exit(1) if something goes wrong; return + -1 instead. Don't refer to obsolete option -f to specify the file + format. + +2013-09-10 Joerg Wunsch + + Submitted by Matthias Trute: + bug #36901 flashing Atmega32U4 EEPROM produces garbage on chip + * avrdude.conf.in (ATmega32U4): Fix EEPROM pagesize to 4, the + datasheet is wrong here. + +2013-09-09 Joerg Wunsch + + * configure.ac: check for ar and ranlib in the target tool + namespace, rather than on the host. + +2013-09-08 Joerg Wunsch + + Fix byte-wise EEPROM and flash writes on Xmega + * jtagmkII_private.h (MTYPE_EEPROM_XMEGA): New memory type. + * jtagmkII.c (jtagmkII_write_byte): For Xmega EEPROM, use + memory type MTYPE_EEPROM_XMEGA; for flash writes, always + write 2 bytes starting on an even address. + +2013-09-08 Joerg Wunsch + + * term.c: Implement the "verbose" terminal mode command. + * avrdude.1: Document this. + * doc/avrdude.texi: (Dito.) + +2013-09-07 Joerg Wunsch + + * jtag3.c (jtag3_write_byte): Do not attempt to start the paged + algorithm for EEPROM when being connected through debugWIRE. + +2013-09-06 Joerg Wunsch + + Extend the single-byte algorithm to all devices, both flash and + EEPROM. (Flash cells must have been erased before though.) + * jtag3.c (jtag3_initialize): OCDEN no longer needs to be + considered; a session with "programming" purpose is sufficient + * jtag3.c (jtag3_write_byte): Use the paged algorithm for all + flash and EEPROM areas, not just Xmega. + +2013-09-05 Joerg Wunsch + + Fix single-byte EEPROM updates on Xmega: + * jtag3_private.h (MTYPE_EEPROM_XMEGA): New define. + * jtag3.c (jtag3_write_byte): When updating flash or + EEPROM on Xmega devices, resort to jtag3_paged_write() + after filling and modifying the page cache. + * jtag3.c (jtag3_paged_write): use MTYPE_EEPROM_XMEGA + where appropriate. + * jtag3.c (jtag3_initialize): Open with debugging intent + for Xmega devices, so single-byte EEPROM updates will + work. + +2013-09-04 Joerg Wunsch + + Submitted by Matthias Neeracher: + bug #38732: Support for ATtiny1634 + * avrdude.conf.in (ATtiny1634): New entry. + +2013-09-03 Joerg Wunsch + + Submitted by Brane Ždralo: + patch #7769: Write flash fails for AVR910 programmers + * avr910.c (avr910_paged_write): Fix flash addresses in + 'A' command. + +2013-09-03 Joerg Wunsch + + Submitted by Fred (magister): + bug #38951: AVR109 use byte offset instead of word offset + patch #8045: AVR109 butterfly failing + * butterfly.c (butterfly_paged_load, butterfly_paged_write): + fix calculation of 'A' address when operating on flash memory. + It must be given in terms of 16-bit words rather than bytes. + +2013-09-03 Rene Liebscher + + * avrftdi.c, avrftdi_private.h: added tx buffer size, and use + smaller block sizes as larger sometimes hang + +2013-09-03 Joerg Wunsch + + * avrdude.h: Remove the erase cycle counter (options -y / -Y). + * avr.c: (Dito.) + * main.c: (Dito.) + * avrdude.1: Undocument -y / -Y. + * doc/avrdude.texi: (Dito.) + +2013-09-03 Joerg Wunsch + + bug #39691 Buffer overrun when reading EEPROM byte with JTAGICE3 + * jtag3.c (jtag3_initialize): initialize the eeprom_pagesize + private attribute so the page cache will actually be usable + +2013-09-03 Joerg Wunsch + + bug #38580 Current svn head, xmega and fuses, all fuses tied to fuse0 + * jtag3.c (jtag3_read_byte, jtag3_write_byte): Correctly apply the + relevant part of mem->offset as the address to operate on. + +2013-09-03 Joerg Wunsch + + * fileio.c: Fix "unused variable" warnings. + * avr.c: (Dito.) + * stk500v2.c: (Dito.) + * stk500.c: (Dito.) + * jtagmkII.c: (Dito.) + * term.c: (Dito.) + * ser_posix.c: (Dito.) + +2013-09-02 Joerg Wunsch + + Submitted by Travis Griggs: + bug #38307: Can't write usersig of an xmega256a3 + * stk500v2.c (stk600_xprog_page_erase): allow erasing the usersig space. + +2013-09-02 Joerg Wunsch + + Submitted by Robert Niemi: + bug #35800: Compilation error on certain systems if parport is disabled + * linux_ppdev.h: Conditionalize inclusion of and + on HAVE_PARPORT + +2013-09-02 Joerg Wunsch + + bug #39794: warnings when building avrdude 6.0rc1 under CentOS 6.4 + * pickit.c (usb_open_device): Use %p rather than %X to print "handle" + which is a pointer + * jtag3.c (jtag3_initialize): Initialize "flashsize" to be sure it + proceeds with a valid value. + +2013-09-02 Joerg Wunsch + + bug #39794: warnings when building avrdude 6.0rc1 under CentOS 6.4 + * buspirate.c: Turn the "cmd" argument of the various methods into + a "const unsigned char *"; while doing this, declare all arrays being + passed as arguments to be pointers rather than arrays, as the latter + obfuscates the way arrays are being passed to a callee in C. + * avrftdi.c: (Dito.) + * pickit2.c: (Dito.) + * ft245r.c: (Dito.) + * avr910.c: (Dito.) + * stk500.c: (Dito.) + * bitbang.c: (Dito.) + * bitbang.h: (Dito.) + * avrftdi_tpi.c: (Dito.) + * avrftdi_tpi.h: (Dito.) + * usbasp.c: (Dito.) + * stk500v2.c: (Dito.) + * pgm.h: (Dito.) + * usbtiny.c: (Dito.) + +2013-09-02 Joerg Wunsch + + bug #38023: avrdude doesn't return an error code when attempting + to upload an invalid Intel HEX file + * fileio.c (ihex2b): Turn the "No end of file record found" warning + into an error if no valid record was found at all. + +2013-09-02 Joerg Wunsch + + Submitted by Claus-Justus Heine: + bug #38713: Compilation of the documentation breaks with texinfo-5 + * doc/avrdude.texi: Turn @itemx into @item, add @headitem to STK600 + Routing/Socket card table + +2013-09-02 Joerg Wunsch + + * usbasp.c: Add trace output for -vvv to non-TPI functions, too. + +2013-09-01 Joerg Wunsch + + * usbasp.c (usbasp_tpi_paged_load): Calculate correct + buffer address. + * usbasp.c (usbasp_tpi_paged_write): Calculate correct + buffer address; don't issue a SECTION_ERASE command for + each page (a CHIP_ERASE has been done before anyway); + remove the code that attempted to handle partial page + writes, as all writes are now done with a full page. + +2013-09-01 Joerg Wunsch + + * usbasp.c: Add more trace output, by now only for the TPI + functions. + +2013-08-31 Joerg Wunsch + + * usbasp.c (usbasp_transmit): Add -vvvv trace output. + +2013-08-30 Joerg Wunsch + + bug #39893: Verification failure with AVRISPmkII and Xmega + * stk500v2.c (stk600_xprog_page_erase): Fix argument that is + passed to stk600_xprog_memtype() + +2013-07-11 Joerg Wunsch + + * fileio.c (elf2b): replace elf_getshstrndx() by + elf_getshdrstrndx() as the former one is deprecated + +2013-06-19 Rene Liebscher + + use bitbanging on ftdi mpsse when wrong pins are used + * avrftdi.c, avrftdi_private.h: added additional pin check + and bitbanging fallback + * pindefs.[ch]: added a flag to enable/disable output + * ft245r.c: changes because of added flag above + +2013-05-17 Joerg Wunsch + + Submitted by "Malte" and John McCorquodale: + patch #7876 JTAGICE mkII fails to connect to attiny if debugwire + is enabled AND target has a very slow clock + * jtagmkII.c (jtagmkII_getsync): When leaving debugWIRE mode + temporarily, immediately retry with ISP, rather than leaving. + * stk500v2 (stk500v2_program_enable): Implemented similar logic + for the JTAGICE3. + +2013-05-16 Rene Liebscher + + * configure.ac: reactivate check for TYPE_232H, which does not + exist in libftdi < 0.20 + * avrftdi*.*: changed include check for libftdi/libusb, deactivate + 232H if not available + * ft245r.c: changed include check for libftdi/libusb + +2013-05-08 Joerg Wunsch + + * main.c (main): Add option -l logfile. + * avrdude.1: Document -l option. + * doc/avrdude.texi: (Dito.) + +2013-05-15 Rene Liebscher + + * configure.ac: if both found libftdi and libftdi1 use only libftdi1 + * avrdude.conf.in: fixed buff pins of avrftdi programmers (low + active buffer need now inverted numbers) + * avrftdi*.*: accept also old libftdi (0.20 still works with it), + added powerup to initialize + * ft245r.c: accept libftdi1, code cleanup and make it more similar + to avrfdti (os they might be merged someday) + +2013-05-08 Joerg Wunsch + + * configure.ac (AC_INIT): Bump version to 6.0rc1. + +2013-05-07 Hannes Weisbach + + * avrftdi_private.h: Change size of pin_checklist to N_PINS (from N_PINS-1) + * avrftdi.c: Adapt code to new size of pin_checklist. Remove pins_check() + from set_pin(). + Add pgm->power[up|down] functions as well as fill pgm->enable|disable with + proper content as suggested by Rene Liebscher. + +2013-05-05 Rene Liebscher + + * pindefs.h: use unsigned int if stdint.h is not available and UINT_MAX is 0xffffffff + otherwise use unsinged long + * ft245r.c: added support for more pin functions led, vcc, buff + +2013-05-06 Hannes Weisbach + + * avrftdi_tpi.c: instead of private set_pin() function pointer use the one + declared in struct PROGRAMMER. + * avrftdi_private.h: remove set_pin function pointer. Add pin_checklist_t + member to check pgm->setpin calls during runtime. + * avrftdi.c: remove set_pin function pointer init, add pgm->setpin init. + Convert avrftdi to new 0-based pindefs infrastructure. + * avrdude.conf.in: Change all avrftdi-based programmers' pin definitions to + 0-based. + +2013-05-06 Joerg Wunsch + + * pindefs.h: Include "ac_cfg.h" before testing for HAVE_* macros. + +2013-05-05 Rene Liebscher + + * main.c: revert to rev 1159 (doing pgm_display after pgm_open) + * avrpart.[ch]: moved avr_pin_name to pindefs.[ch] + * pgm.c: moved pins_to_str to pindefs.[ch], added initialization of + new pin definitions in pgm_new() + * pindefs.[ch]: added moved functions from other files, added a lot of + documentation, reformatted files using astyle to have consistent spacing, + added a new generic check function for pins + * ft245r.c: used new generic pin check function + +2013-05-03 Rene Liebscher + + Create new pin definition data structures to support 0-based pin numbers, + and mixed inverse/non-inverse pin lists. + * avrftdi.c,buspirate.c,linuxgpio.c,par.c,serbb_*.c: added function call + to fill old pinno entries from new pin definitions. + * pindefs.[hc]: added data struct and helper functions for new pin definitions + * avrdude.conf.in: pins in entries using ftdi_syncbb are now 0-based + * config_gram.y: allow combinations of inverted and non-inverted pins in pin lists + * ft245r.c: reworked to work directly with the new pin definitions, + pins are now 0-based, inverse pins are supported, buff is supported + * pgm.[ch]: added new pin definitions field to programmer structure, + adapted pin display functions + +2013-05-03 Hannes Weisbach + + * avrftdi_private.h: Remove update forward declaration from avrftdi_print to + avrftdi_log. + * avrftdi_tpi.c: Do all I/O in terms of pgm->cmd_tpi()-calls instead of + avrftdi_tpi_[read,write]_byte(). + Remove unnecessary set_pin call to set MOSI high, speeds up I/O. + Removes SKEY array, moves it to tpi.h. + Integrate new avr_tpi_[program_enable,chip_erase]() and functions into + avrftdi_tpi. + * avrftdi_tpi.h: Remove avrftdi_tpi_[program_enable,chip_erase] forward + declarations. + * avr.c: Adds avr_tpi_chip_erase() generic TPI chip erase function. + Adds avr_tpi_program_enable() - generic TPI external programming enable + function. Sets guard time, reads identification register, sends SKEY command + and key, checks NVMEN bit. The required guard time has to be passed as + parameter. + * tpi.h: Adds SKEY array including CMD_SKEY in "correct" order. + +2013-05-02 Hannes Weisbach + + * avrftdi_private.h: Add libusb-1.0 include to fix include order in windows. + * NEWS: Add notice avrftdi supporting TPI + * avr.c: Fix avr_tpi_poll_nvmbsy() - poll read data instead of return code + * avrftdi_private.h, avrftdi.c: move logging #defines to from avrftdi.c to + avrftdi_private.h, so that they are available for avrftdi_tpi, too. + +2013-04-30 Hannes Weisbach + + * tpi.h: Add definition for TPI Identification Code + * avrftdi_tpi.c: Add TPI-support for FTDI-based programmers + * avrftdi_private.h: Add common include file for FTDI-based programmers + +2013-04-28 Hannes Weisbach + + * avrftdic: Rework of textual output. Messages are divided by severity and + printed accordingly to the verbosity, as specified by the user. The provided + severity level are (ERROR, WARN, INFO, DEBUG, TRACE). Where "ERROR" messages + are always printed. Shortcut-macros including function, from which the + output was generated, and line number were also added. + Some log messages were updated and other code warnings removed. + +2013-04-27 Hannes Weisbach + + * configure.ac: Add libftdi1 library check, remove TYPE_232H DECL check + * Makefile.am: Add @LIBFTDI1@ to avrdude_LDADD + * avrftdi.c: Update from libftdi0 to libftdi1. Use libftdi1's function to + find a device by vid/pid/serial instead of doing it ourself and add/update + error messages. avrftdi_print is changed so that a message is printed when + the verbosity level is greater or equal the message level, to have always-on + messages. + Fix a bug where the RX fifo of the FTDI chip is full, resulting in STALL/NAK + of the ongoing OUT request and subsequently timeout, because an IN request + cannot be issued due to the synchronous part of libftdi. This should fix + #38831 and #38659. + +2013-04-25 Joerg Wunsch + + * configure.ac(AC_CONFIG_HEADERS): Replace the old AM_CONFIG_HEADER + by this; automake 1.13+ barfs. + +2013-03-12 Joerg Wunsch + + * avrdude.conf.in (ATmega2564RFR2, ATmega1284RFR2, ATmega644RFR2): + New devices + +2013-01-30 Rene Liebscher + + patch #7724 Add TPI support for Bus Pirate using bitbang mode + * buspirate.[ch]: added support for BusPirate Bitbanging + * pgm_type.c: added entry for buspirate_bb + * avrdude.conf.in: added entry for buspirate_bb + +2013-01-30 Rene Liebscher + + patch #7936 Patch to support BusPirate AVR Extended Commands mode + * buspirate.c: added support for BusPirate AVR Extended Commands mode + * avrdude.1: added doc for nopagedread parameter + * doc/avrdude.texi: added doc for nopagedread parameter + +2013-01-30 Rene Liebscher + + patch #7723 Bus Pirate “raw-wire” mode which can run down to 5 kHz + * buspirate.c: added raw wire mode + * avrdude.1: added doc for rawfreq parameter + * doc/avrdude.texi: added doc for rawfreq parameter + +2013-01-30 Rene Liebscher + + bug #37977 Support for Openmoko Debug Board + * avrdude.conf.in: added openmoko entry + +2013-01-29 Rene Liebscher + + patch #7932 Read USBtiny VID and PID from avrdude.conf if provided. + * avrdude.conf.in: added usbpid, usbvid to usbtiny + * usbtiny.[ch]: use usbpid, usbpid if provided in config file + +2013-01-26 Joerg Wunsch + + bug #38172: avrftdi: Incorrect information in avrdude.conf + * avrdude.conf.in (avrftdi): fix comments about ACBUS vs. ADBUS; + add a comment that the MPSSE signals are fixed by the FTDI + hardware and cannot be changed + +2013-01-09 Rene Liebscher + + patch #7165 Add support for bitbanging GPIO lines using the Linux sysf GPIO interface + * doc/avrdude.texi,avrdude.1: added doc for linuxgpio + * avrdude.conf.in: added template for linuxgpio programmer + * config_gram.y: pin numbers restricted to [PIN_MIN, PIN_MAX] + * pindefs.h: added PIN_MIN, PIN_MAX, removed unused LED_ON/OFF + * configure.ac: configure option enable-linuxgpio, print of enabled options + * linuxgpio.[ch]: new source for linuxgpio programmer + * Makefile.am: added linuxgpio to sources list + * pgm_type.c: added linuxgpio to programmer types list + +2013-01-08 Joerg Wunsch + + * jtagmkI.c (jtagmkI_prmsg): replace a putchar() by putc(...stderr) + * jtagmkII.c (jtagmkII_prmsg): (Dito.) + * jtag3.c (jtag3_prevent, jtag3_prmsg): (Dito.) + +2013-01-02 Joerg Wunsch + + * usb_libusb.c (usbdev_open): Downgrade the max transfer size for + the main data endpoints when being forced so by the USB; this can + happen when attaching the JTAGICE3 to a USB 1.1 connection + * jtag3.c (jtag3_initialize): When detecting a downgraded max + transfer size on the JTAGICE3 (presumably, due to being connected + to USB 1.1 only), bail out as its firmware cannot properly handle + this (by now) + +2013-01-02 Joerg Wunsch + + * ChangeLog: annual ChangeLog rotation time diff --git a/xs/src/avrdude/ChangeLog-2014 b/xs/src/avrdude/ChangeLog-2014 new file mode 100644 index 000000000..3fe7a53aa --- /dev/null +++ b/xs/src/avrdude/ChangeLog-2014 @@ -0,0 +1,697 @@ +2014-11-26 Joerg Wunsch + + * ser_win32.c (net_send): Properly declare argument 2 as being a + pointer to const data. + +2014-11-25 Joerg Wunsch + + patch #8380: adds 500k 1M 2M baud to ser_posix.c + * ser_posix.c: Add a hack to allow for arbitrary baud rates on + Linux + +2014-11-25 Joerg Wunsch + + patch #8437: [PATCH] Serial-over-ethernet for Win32 + * configure.ac: Check for ws2_32 library + * ser_win32.c: Add hooks for forwarding serial data over + TCP connections + * avrdude.1: Drop previous restriction of -P net: + * doc/avrdude.conf: (Dito.) + +2014-11-24 Joerg Wunsch + + bug #42908: no external reset at JTAGICE3 + * jtag3.c (jtag3_initialize): Retry with external reset applied if + the first sign-on attempt fails. + +2014-11-23 Joerg Wunsch + + * main.c: Allow the -B option argument to be suffixed with Hz, + kHz, or MHz, in order to specify a bitclock frequency rather than + period. + * avrdude.1: Document the -B option changes. + * doc/avrdude.texi: (Dito.) + +2014-11-23 Joerg Wunsch + + bug #40870: config nitpick: ATtiny25/45/85 have 1 calibration byte not 2 + * avrdude.conf.in (ATtiny25, ATtiny45, ATtiny85): Fix size of + "calibration" memory area + +2014-11-23 Joerg Wunsch + + bug #43137: Writing and reading incorrect pages when using jtagicemkI + * jtagmkI.c (jtagmkI_paged_write, jtagmkI_paged_load): correctly + calculate the size of a partial (non-pagesize) buffer + +2014-11-23 Joerg Wunsch + + bug #43078: AVRDUDE crashes after sucessfully reading/writing eeprom + * jtag3.c (jtag3_edbg_recv_frame): Return correct length as + reported in the response packet, rather than full 512 byte which + are always reported by the CMSIS-DAP layer. Miscalculations + based on the wrongly reported length caused heap corruption + elsewhere, so this is presumably also a fix for bug #43078. + +2014-11-20 Joerg Wunsch + + bug #41561: AVRDUDE 6.0.1/USBasp doesn't write first bytes of + flash page + * usbasp.c (usbasp_spi_paged_write): Remove USBASP_BLOCKFLAG_LAST. + It is no longer needed, as we always write full pages now in paged + write mode. + +2014-11-19 Joerg Wunsch + + bug #43626: Inconsistent timeouts in stk500v2 + * stk500v2.c (stk500v2_recv): Add a reference to the bug report + but don't change anything, lest to break it somehow + +2014-11-14 Rene Liebscher + + patch #8529 2 more ftdi_syncbb devices + * avrdude.conf.in: added 2 new programmers + +2014-11-14 Rene Liebscher + + bug #40142 Floating point exception on Ubuntu 10.04 + * avr.c: avoid division by zero in report_progress(), eg. when + writing an empty eeprom file were total becomes 0 + +2014-11-13 Rene Liebscher + + patch #8504 buspirate: Also support "cpufreq" extended parameter + in binary mode + * buspirate.c: applied patch + switch off at disable (even when + a reset follows) + some general whitespace/tab cleanup + +2014-10-15 Joerg Wunsch + + bug #37441: lockbits in ATxmega + avrdude = problem + * fileio.c: replace strmcp(..., "lock") by strncmp(..., "lock", 4) + where applicable + * jtag3.c: (Dito.) + * jtagmkII.c: (Dito.) + +2014-10-07 Joerg Wunsch + + bug #42267: jtag3isp fails to read lock and fuse bytes directly + after changing lock byte + * stk500v2.c (stk500isp_write_byte): As a workaround for broken + tool firmware, add 10 ms of delay before returning from any + single-byte write operation. + +2014-10-06 Joerg Wunsch + + * stk500v2.c: Use stk500isp_read_byte/stk500isp_write_byte for + every byte-wide access (rather than JTAGICE3 only). This finally + obsoletes the use of the prehistoric SPI_MULTI command where + AVRDUDE used to assemble all the low-level ISP stuff by itself. + +2014-10-06 Joerg Wunsch + + bug #22248: Read efuse error + * avrdude.conf.in (m168, m328, m48, m88, t1634, t26, t261, t461, + t861, t88): In efuse (or hfuse for t26) read operation, turn all + bits in byte 3 from "x" to "o" (output); this is a first step + towards fixing the symptoms mentioned in the bug, by unifying the + behaviour between different AVRs. Not touched are the historic + devices where the fuses are not documented to form a full byte + each (2333, 4433, 4434, 8535, m103, m161, m163). + +2014-09-22 Joerg Wunsch + + bug #43268: usb_drain() call causes LUFA AVR-ISP MKII Code to Fail + * usb_libusb.c (usbdev_drain): Make this a dummy function only. + +2014-08-19 Rene Liebscher + + patch #7694 Add support for the atmega32m1 + * avrdude.conf.in: added ATmega32M1 + +2014-08-18 Rene Liebscher + + patch #8440 Print part id after signature + When printing the part signature also print the part id. + * avrpart.c (locate_part_by_signature): New function. + * libavrdude.h (locate_part_by_signature): New function. + * main.c (main): Use the new function to find the part and print its id. + +2014-08-18 Rene Liebscher + + patch #8511 Fix reset on FT245R + * ft245r.c: applied patch + +2014-08-18 Rene Liebscher + + bug #43002 usbasp debug output typo + * usbasp.c: fixed typos + +2014-07-16 Joerg Wunsch + + bug #42662 clang warnings under FreeBSD 10.x + * avrftdi.h: Fix header guard macro name. + * pgm_type.c (programmers_types): Remove duplicate "const". + +2014-07-16 Rene Liebscher + + bug #42662 clang warnings under FreeBSD 10.x + * avrftdi.c: remove warnings + * buspirate.c: (Dito.) + * dfu.c: (Dito.) + * fileio.c: (Dito.) + * libavrdude.h: (Dito.) + * pickit2.c: (Dito.) + * safemode.c: (Dito.) + * ser_avrdoper.c: (Dito.) + * ser_posix.c: (Dito.) + * ser_win32.c: (Dito.) + * stk500v2.c: (Dito.) + * usb_libusb.c: (Dito.) + * usbasp.c: (Dito.) + + * config_gram.y: fix problem when using parent part with usbpid lists + (existing list was extended not overwritten) + +2014-07-11 Axel Wachtler + + * avrftdi.c: rollback to vfprintf, fixed error from -r1305, (patch #8463) + +2014-06-23 Rene Liebscher + + * linux_ppdev.h: added missing msg level for avrdude_message + in ppi_claim/ppi_release macros + * avrftdi.c: added break at end of default + +2014-06-21 Rene Liebscher + + patch #8419 fix ftdi_syncbb hang with libftdi 1 + * ft245r.c: set pthread cancel type to asynchronous, reorder ftdi_usb_close/deinit + +2014-06-17 Rene Liebscher + + * avrftdi_private.h: added missing msg level for avrdude_message + in E/E_VOID macros + +2014-06-17 Rene Liebscher + + Removing exit calls from config parser + * config.h: cleanup, left only internally needed definitions + * config.c: removed exit calls, use yyerror and yywarning + * config_gram.y: (Dito.) + * lexer.l: (Dito.) + * libavrdude.h: removed internal definitions of config parser + * main.c: removed yyerror, it is now in config.c + * jtagmkII.c: added missing free in error case + * pgm.c: replaced exits by returns + * pickit2.c: add missing return + +2014-06-13 Axel Wachtler + + start removing global "verbose" variable, for avrdude library. + * arduino.c: added verbose level in avrdude_message() + * avr910.c: (Dito.) + * avr.c: (Dito.) + * avrdude.h: (Dito.) + * avrftdi.c: (Dito.) + * avrpart.c: (Dito.) + * bitbang.c: (Dito.) + * buspirate.c: (Dito.) + * butterfly.c: (Dito.) + * config.c: (Dito.) + * config_gram.y: (Dito.) + * dfu.c: (Dito.) + * fileio.c: (Dito.) + * flip1.c: (Dito.) + * flip2.c: (Dito.) + * ft245r.c: (Dito.) + * jtag3.c: (Dito.) + * jtagmkI.c: (Dito.) + * jtagmkII.c: (Dito.) + * lexer.l: (Dito.) + * libavrdude.h: (Dito.) + * linuxgpio.c: (Dito.) + * main.c: (Dito.) + * par.c: (Dito.) + * pgm.c: (Dito.) + * pickit2.c: (Dito.) + * pindefs.c: (Dito.) + * ppi.c: (Dito.) + * ppiwin.c: (Dito.) + * safemode.c: (Dito.) + * ser_avrdoper.c: (Dito.) + * serbb_posix.c: (Dito.) + * serbb_win32.c: (Dito.) + * ser_posix.c: (Dito.) + * ser_win32.c: (Dito.) + * stk500.c: (Dito.) + * stk500generic.c: (Dito.) + * stk500v2.c: (Dito.) + * term.c: (Dito.) + * update.c: (Dito.) + * usbasp.c: (Dito.) + * usb_libusb.c: (Dito.) + * usbtiny.c: (Dito.) + * wiring.c: (Dito.) + +2014-06-11 Rene Liebscher + + bug #42516 spelling-error-in-binary + * stk500v2.c, avrftdi.c, usbasp.c: fixed spelling errors + +2014-06-01 Rene Liebscher + + bug #42337 avrdude.conf updates for UM232H/CM232H + * avrdude.conf.in: fixed entries as proposed + +2014-05-19 Joerg Wunsch + + bug #41854: avrdude 6.1 does not compile on systems without libUSB + Submitted by Didrik Madheden: + * flip1.c: Provide dummy functions for the #ifndef HAVE_LIBUSB case + * flip2.c: (Dito.) + +2014-05-19 Joerg Wunsch + + * libavrdude.h: Join the former "public" header files (avr.h avrpart.h pindefs.h + serial.h fileio.h safemode.h update.h pgm_type.h config.h confwin.h lists.h) into + a single header that can be included by anyone wanting to link against the + library + * avr.h: Remove file. + * avrpart.h: (Dito.) + * pindefs.h: (Dito.) + * serial.h: (Dito.) + * fileio.h: (Dito.) + * safemode.h: (Dito.) + * update.h: (Dito.) + * pgm.h: (Dito.) + * pgm_type.h: (Dito.) + * config.h: (Dito.) + * confwin.h: (Dito.) + * lists.h: (Dito.) + * Makefile.am: Adapt for new include file constellation; install shared lib + * configure.ac: Bump version date + * arduino.c: #include rather than a bunch of different headers + * avr910.c: (Dito.) + * avr910.h: (Dito.) + * avr.c: (Dito.) + * avrftdi.c: (Dito.) + * avrftdi_private.h: (Dito.) + * avrftdi_tpi.c: (Dito.) + * avrftdi_tpi.h: (Dito.) + * avr.h: (Dito.) + * avrpart.c: (Dito.) + * avrpart.h: (Dito.) + * bitbang.c: (Dito.) + * buspirate.c: (Dito.) + * butterfly.c: (Dito.) + * config.c: (Dito.) + * config_gram.y: (Dito.) + * config.h: (Dito.) + * confwin.c: (Dito.) + * confwin.h: (Dito.) + * dfu.c: (Dito.) + * fileio.c: (Dito.) + * fileio.h: (Dito.) + * flip1.c: (Dito.) + * flip1.h: (Dito.) + * flip2.c: (Dito.) + * flip2.h: (Dito.) + * ft245r.c: (Dito.) + * ft245r.h: (Dito.) + * jtag3.c: (Dito.) + * jtagmkI.c: (Dito.) + * jtagmkII.c: (Dito.) + * lexer.l: (Dito.) + * libavrdude.h: (Dito.) + * linuxgpio.c: (Dito.) + * lists.c: (Dito.) + * lists.h: (Dito.) + * main.c: (Dito.) + * par.c: (Dito.) + * pgm.c: (Dito.) + * pgm_type.c: (Dito.) + * pgm_type.h: (Dito.) + * pickit2.c: (Dito.) + * pickit2.h: (Dito.) + * pindefs.c: (Dito.) + * pindefs.h: (Dito.) + * ppi.c: (Dito.) + * ppiwin.c: (Dito.) + * safemode.c: (Dito.) + * safemode.h: (Dito.) + * ser_avrdoper.c: (Dito.) + * serbb_posix.c: (Dito.) + * serbb_win32.c: (Dito.) + * serial.h: (Dito.) + * ser_posix.c: (Dito.) + * ser_win32.c: (Dito.) + * stk500.c: (Dito.) + * stk500generic.c: (Dito.) + * stk500v2.c: (Dito.) + * stk500v2_private.h: (Dito.) + * term.c: (Dito.) + * term.h: (Dito.) + * update.c: (Dito.) + * update.h: (Dito.) + * usbasp.c: (Dito.) + * usbasp.h: (Dito.) + * usb_libusb.c: (Dito.) + * usbtiny.c: (Dito.) + * usbtiny.h: (Dito.) + * wiring.c: (Dito.) + +2014-05-19 Joerg Wunsch + + * main.c: Cleanup unused include files. + +2014-05-19 Joerg Wunsch + + * linux_ppdev.h: Caught two more instances of exit() + * configure.ac: Add AC_CONFIG_MACRO_DIR as suggested by libtoolize + * Makefile.am: add -I m4 to ACLOCAL_AMFLAGS as suggested by libtoolize + +2014-05-16 Axel Wachtler + + * arduino.c: Replacing all occurences of fprintf(stderr,...) with avrdude_message(...) + in potential library functions. + * avr910.c: (Dito.) + * avr.c: (Dito.) + * avrdude.h: (Dito.) + * avrftdi.c: (Dito.) + * avrftdi_private.h: (Dito.) + * avrpart.c: (Dito.) + * bitbang.c: (Dito.) + * buspirate.c: (Dito.) + * butterfly.c: (Dito.) + * config.c: (Dito.) + * config_gram.y: (Dito.) + * dfu.c: (Dito.) + * fileio.c: (Dito.) + * flip1.c: (Dito.) + * flip2.c: (Dito.) + * ft245r.c: (Dito.) + * jtag3.c: (Dito.) + * jtagmkI.c: (Dito.) + * jtagmkII.c: (Dito.) + * lexer.l: (Dito.) + * linuxgpio.c: (Dito.) + * linux_ppdev.h: (Dito.) + * main.c: (Dito.) + * par.c: (Dito.) + * pgm.c: (Dito.) + * pickit2.c: (Dito.) + * pindefs.c: (Dito.) + * ppi.c: (Dito.) + * ppiwin.c: (Dito.) + * safemode.c: (Dito.) + * ser_avrdoper.c: (Dito.) + * serbb_posix.c: (Dito.) + * serbb_win32.c: (Dito.) + * ser_posix.c: (Dito.) + * ser_win32.c: (Dito.) + * stk500.c: (Dito.) + * stk500generic.c: (Dito.) + * stk500v2.c: (Dito.) + * term.c: (Dito.) + * update.c: (Dito.) + * usbasp.c: (Dito.) + * usb_libusb.c: (Dito.) + * usbtiny.c: (Dito.) + * wiring.c: (Dito.) + +2014-05-16 Joerg Wunsch + + * configure.ac: Bump version, add libtool hooks + * Makefile.am: First attempt to define building a shared library + (not to be installed by now) + +2014-05-16 Joerg Wunsch + + * dfu.c (dfu_open, dfu_init): Fix signature of the dummy functions + (in the !HAVE_LIBUSB case) to match prototypes. + +2014-05-16 Joerg Wunsch + + * avr910.c: Replace all occurences of exit() in potential library + functions by appropriate return values + * avrftdi.c: (Dito.) + * bitbang.c: (Dito.) + * bitbang.h: (Dito.) + * buspirate.c: (Dito.) + * butterfly.c: (Dito.) + * config.c: (Dito.) + * flip2.c: (Dito.) + * ft245r.c: (Dito.) + * jtagmkI.c: (Dito.) + * jtagmkII.c: (Dito.) + * linuxgpio.c: (Dito.) + * main.c: (Dito.) + * par.c: (Dito.) + * pgm.c: (Dito.) + * pickit2.c: (Dito.) + * pindefs.c: (Dito.) + * pindefs.h: (Dito.) + * ser_avrdoper.c: (Dito.) + * ser_posix.c: (Dito.) + * ser_win32.c: (Dito.) + * serbb_posix.c: (Dito.) + * serbb_win32.c: (Dito.) + * stk500.c: (Dito.) + * stk500v2.c: (Dito.) + +2014-05-07 Rene Liebscher + + bug #42310: New part description for AT90PWM216 + * avrdude.conf.in: added pwm216 entry + +2014-05-07 Rene Liebscher + + bug #42158: Linux GPIO - Source Typo + * pindefs.h: fixed typo + +2014-04-14 Rene Liebscher + + bug #42056: double free or corruption triggered at exit + * pgm.c: copy usbpid list in pgm_dup + +2014-04-05 Joerg Wunsch + + * avrdude.1: Remove the note that users might edit the system-wide + config file. This file will be overwritten by the next + installation, so it's not a good idea to manually modify it. + Using the -C +file option is a much better way for user + modifications. + * doc/avrdude.texi: (Dito.) + * avrdude.conf.in: Add a warning to not modify the file manually. + +2014-03-13 Joerg Wunsch + + * configure.ac (AC_INIT): Bump version for post-6.1. + +2014-03-12 Joerg Wunsch + + * configure.ac (AC_INIT): Bump version to 6.1. + +2014-03-12 Joerg Wunsch + + * pgm.c (pgm_free): Cleanup police: destroy the p->usbpid + list when freeing the programmer struct. + +2014-03-12 Joerg Wunsch + + bug #40782: Verify errors for object size > 16 k on x32e5 due + to typo in avrdude.conf + * avrdude.conf.in (ATmega8E5, ATmega32E5): fix boot location + +2014-02-28 Joerg Wunsch + + * avrdude.conf.in (atmelice, atmelice_pdi, atmelice_dw, atmelice_isp): + New entries. + * avrdude.1: Document the Atmel-ICE addition. + * doc/avrdude.texi: (Dito.) + * usbdevs.c (USB_DEVICE_ATMEL_ICE): New entry. + +2014-02-28 Joerg Wunsch + + * main.c: Bump copyright year. + +2014-02-28 Joerg Wunsch + + * jtag3.c (jtag3_recv): avoid memmov'ing more data than available + +2014-02-27 Joerg Wunsch + + * avrdude.1: Documentation update for EDBG. + * doc/avrdude.texi: (Dito.) + +2014-02-27 Joerg Wunsch + + * jtag3.c: For EDBG protocol, always use 512-byte block I/O. The + lower layers will split this according to the EP's maxsize. This + makes it work over USB 1.1 connections (albeit very slowly, due to + the interrupt transfers used). + +2014-02-27 Joerg Wunsch + + * config_gram.y: Turn the usbpid parameter of the programmer into + a list of PIDs. Make the JTAGICE3 programmer handle a list of + PIDs, by trying each of them in sequence. Use a single, central + jtag3_open_common() function to handle the common code of all + jtag3_open_* functions. Centralize all USB VID/PID definitions in + usbdevs.h. + * flip1.c: (Dito.) + * ft245r.c: (Dito.) + * stk500v2.c: (Dito.) + * jtag3.c: (Dito.) + * jtag3.h: (Dito.) + * flip2.c: (Dito.) + * usbdevs.h: (Dito.) + * pgm.c: (Dito.) + * serial.h: (Dito.) + * pgm.h: (Dito.) + * usbtiny.c: (Dito.) + * usbasp.c: (Dito.) + * avrftdi.c: (Dito.) + * usbtiny.h: (Dito.) + * avrdude.conf.in: (Dito.) + * usbasp.h: (Dito.) + * usb_libusb.c: (Dito.) + +2014-02-27 Joerg Wunsch + + * usb_libusb.c (usbdev_open): Replace all calls to exit(1) by + return -1 + +2014-02-26 Joerg Wunsch + + * jtag3_private.h: Add EDBG/CMSIS-DAP specific constants. + * jtag3.c: Add EDBG/CMSIS-DAP protocol implementation. + * serial.h: (Dito.) + * usbdevs.h: (Dito.) + * usb_libusb.c: (Dito.) + * configure.ac: (Dito.) + * avrdude.conf.in: Add JTAGICE3 and XplainedPro entries using + EDBG. + * configure.ac: Bump version date. + +2014-02-22 Joerg Wunsch + + * usb_libusb.c (usbdev_recv_frame): Fix a bug where a new recv + request was issued even though all desired data had aldready + been received. + +2014-02-21 Joerg Wunsch + + * serial.h: Change the second parameter of the ser_open method + from "baud" into a "union pinfo", so the USB parameters can be + passed without hacks. + * arduino.c: (Dito.) + * avr910.c: (Dito.) + * buspirate.c: (Dito.) + * butterfly.c: (Dito.) + * jtag3.c: (Dito.) + * jtagmkI.c: (Dito.) + * jtagmkII.c: (Dito.) + * ser_avrdoper.c: (Dito.) + * ser_posix.c: (Dito.) + * ser_win32.c: (Dito.) + * stk500.c: (Dito.) + * stk500v2.c: (Dito.) + * usb_libusb.c: (Dito.) + * wiring.c: (Dito.) + +2014-01-30 Joerg Wunsch + + [bug #41402] dfu.c missing include + * dfu.c: include where uint16_t is defined + +2014-01-28 Joerg Wunsch + + * avrdude.conf.in (ATmega256RFR2 et al.): Fix EEPROM size. + +2014-01-27 Joerg Wunsch + + [bug #41357] OS X: Avrdude messes with the usb stack? + * usb_libusb.c (usbdev_close): Only issue the usb_reset() for + Linux systems, as these are the only ones that seem to require + it under some circumstances. + +2014-01-22 Joerg Wunsch + + * configure.ac (libelf): check against elf_getshdrstrndx() rather + than just elf_begin() only, so it is clear we found a sufficiently + recent libelf to work with. + +2014-01-22 Joerg Wunsch + + Contributed by Alan Horstmann: + bug #40897: AT Mega2560 not correctly programmed with stk500(v1) ISP (solution patch) + * stk500.c: Implement extended address byte handling. + * avrdude.conf.in (ATmega2560): enable stk500_devcode so + STK500v1 protocol actually starts at all. + +2014-01-17 Joerg Wunsch + + * flip1.c: Implement the meat of FLIP version 1 protocol. + * avrdude.1: Document the new protocol. + * doc/avrdude.texi: (Dito.) + +2014-01-17 Joerg Wunsch + + * flip2.c (flip2_page_erase): Remove unimplemented function. + * dfu.h: Correctly conditionalize vs. ; + add adjustable timeout (struct dfu_dev); add dfu_abort() + * dfu.c (dfu_abort): New function; implement adjustable timeout. + +2014-01-17 Joerg Wunsch + + * configure.ac (libhid): Turn from AC_TRY_RUN into + AC_TRY_COMPILE, so it also works for cross-compilation + setups. + +2014-01-16 Joerg Wunsch + + * dfu.c (dfu_init): Move the descriptor checks up into the + FLIP protocol implementation. + * flip2.c (flip2_initialize): (Dito.) + * flip1.c (flip1_initialize): (Dito.) + +2014-01-16 Joerg Wunsch + + * flip2.c: Rename from flip.c + * flip2.h: Rename from flip.h + * Makefile.am: Reflect the renaming. + * dfu.c: Update information how to get GPL. + * dfu.h: (Dito.) + +2014-01-16 Joerg Wunsch + + * flip.c (flip2_initialize): Check user is running on an Xmega + device. + +2014-01-15 Joerg Wunsch + + * flip.c: Added some verbose-level messages (-vv) + * dfu.c: Added some verbose-level messages (-vvvv) + +2014-01-15 Joerg Wunsch + + Submitted by Kirill Levchenko: + patch #7896: DFU FLIPv2 programming support + * pgm_type.c: Add the flip2 programmer type. + * config_gram.y: Allow for the usbid keyword in a device definition. + * avrdude.conf.in: Add usbpid values to those Xmega devices where + applicable. + * avrpart.h: Add usbpid device field. + * dfu.c: (New file.) + * dfu.h: (New file.) + * flip.c: (New file.) + * flip.h: (New file.) + * Makefile.am: Add new files. + * doc/avrdude.texi: Document the changes. + * avrdude.1: (Dito.) + +2014-01-15 Joerg Wunsch + + * ChangeLog-2013: Annual changelog rotation. diff --git a/xs/src/avrdude/ChangeLog-2015 b/xs/src/avrdude/ChangeLog-2015 new file mode 100644 index 000000000..edc274188 --- /dev/null +++ b/xs/src/avrdude/ChangeLog-2015 @@ -0,0 +1,54 @@ +2015-12-15 Joerg Wunsch + + * avrdude.1 (-C): Do not suggest users might change the + default config file. It will be overwritten by updates. + +2015-12-09 Joerg Wunsch + + bug #46610: Floating point exception (core dumped) arch linux rpi2 + bug #46483: version 6.2. ser_open(): can't set attributes for device + * ser_posix.c: Back out change from patch #8380 + +2015-11-16 Joerg Wunsch + + * configure.ac: Bump for post-release 6.2. + +2015-11-16 Joerg Wunsch + + * configure.ac: Released version 6.2. + +2015-10-31 Joerg Wunsch + + Submitted by Martino Facchin: + bug #45727: Wrong atmega8u2 flash parameters + * avrdude.conf.in (ATmega8U2): correct page and block size + +2015-10-31 Joerg Wunsch + + Submitted by Pasquale Cocchini: + bug #46020: Add TIAO TUMPA to the conf file. + * avrdude.conf.in (tumpa): New entry. + +2015-10-31 Joerg Wunsch + + Submitted by Pasquale Cocchini: + bug #46021: Please add read in the memory lock section of ATtiny85 + * avrdude.conf.in (ATtiny25/45/85): add read pattern for lock bits + +2015-10-31 Joerg Wunsch + + * Makefile.am (libavrdude_a_SOURCES): reflect recent changes + (pgm.h is gone, config.h is new). + +2015-04-09 Joerg Wunsch + + bug #44717: avrdude creates empty flash dump + * update.c (do_op): When about to write an empty flash dump file, + warn about this to avoid surprises. + * avrdude.1: Document the truncation of trailing 0xFF bytes for + flash memory areas. + * doc/avrdude.texi: (Dito.) + +2015-04-09 Joerg Wunsch + + Annual ChangeLog rotation. diff --git a/xs/src/avrdude/Makefile.am b/xs/src/avrdude/Makefile.am new file mode 100644 index 000000000..d1ed47845 --- /dev/null +++ b/xs/src/avrdude/Makefile.am @@ -0,0 +1,206 @@ +# +# avrdude - A Downloader/Uploader for AVR device programmers +# Copyright (C) 2003, 2004 Theodore A. Roth +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# +# $Id$ +# + +EXTRA_DIST = \ + ChangeLog \ + ChangeLog-2001 \ + ChangeLog-2002 \ + ChangeLog-2003 \ + ChangeLog-2004-2006 \ + ChangeLog-2007 \ + ChangeLog-2008 \ + ChangeLog-2009 \ + ChangeLog-2010 \ + ChangeLog-2011 \ + ChangeLog-2012 \ + ChangeLog-2013 \ + avrdude.1 \ + avrdude.spec \ + bootstrap + +CLEANFILES = \ + config_gram.c \ + config_gram.h \ + lexer.c + +BUILT_SOURCES = $(CLEANFILES) + +#SUBDIRS = doc @WINDOWS_DIRS@ +#DIST_SUBDIRS = doc windows + +# . lets build this directory before the following in SUBDIRS +SUBDIRS = . +# doc comes here, and we want to use the built avrdude to generate the parts list +SUBDIRS += @SUBDIRS_AC@ +SUBDIRS += @WINDOWS_DIRS@ +DIST_SUBDIRS = @DIST_SUBDIRS_AC@ + +AM_YFLAGS = -d + +avrdude_CPPFLAGS = -DCONFIG_DIR=\"$(sysconfdir)\" + +libavrdude_a_CPPFLAGS = -DCONFIG_DIR=\"$(sysconfdir)\" +libavrdude_la_CPPFLAGS = $(libavrdude_a_CPPFLAGS) + +avrdude_CFLAGS = @ENABLE_WARNINGS@ + +libavrdude_a_CFLAGS = @ENABLE_WARNINGS@ +libavrdude_la_CFLAGS = $(libavrdude_a_CFLAGS) + +avrdude_LDADD = $(top_builddir)/$(noinst_LIBRARIES) @LIBUSB_1_0@ @LIBHIDAPI@ @LIBUSB@ @LIBFTDI1@ @LIBFTDI@ @LIBHID@ @LIBELF@ @LIBPTHREAD@ -lm + +bin_PROGRAMS = avrdude + +noinst_LIBRARIES = libavrdude.a +lib_LTLIBRARIES = libavrdude.la + +# automake thinks these generated files should be in the distribution, +# but this might cause trouble for some users, so we rather don't want +# to have them there. +# +# See +# +# https://savannah.nongnu.org/bugs/index.php?func=detailitem&item_id=15536 +# +# for why we don't want to have them. +dist-hook: + rm -f \ + $(distdir)/lexer.c \ + $(distdir)/config_gram.c \ + $(distdir)/config_gram.h + +libavrdude_a_SOURCES = \ + config_gram.y \ + lexer.l \ + arduino.h \ + arduino.c \ + avr.c \ + avr910.c \ + avr910.h \ + avrdude.h \ + avrftdi.c \ + avrftdi.h \ + avrftdi_private.h \ + avrftdi_tpi.c \ + avrftdi_tpi.h \ + avrpart.c \ + bitbang.c \ + bitbang.h \ + buspirate.c \ + buspirate.h \ + butterfly.c \ + butterfly.h \ + config.c \ + config.h \ + confwin.c \ + crc16.c \ + crc16.h \ + dfu.c \ + dfu.h \ + fileio.c \ + flip1.c \ + flip1.h \ + flip2.c \ + flip2.h \ + freebsd_ppi.h \ + ft245r.c \ + ft245r.h \ + jtagmkI.c \ + jtagmkI.h \ + jtagmkI_private.h \ + jtagmkII.c \ + jtagmkII.h \ + jtagmkII_private.h \ + jtag3.c \ + jtag3.h \ + jtag3_private.h \ + libavrdude.h \ + linuxgpio.c \ + linuxgpio.h \ + linux_ppdev.h \ + lists.c \ + my_ddk_hidsdi.h \ + par.c \ + par.h \ + pgm.c \ + pgm_type.c \ + pickit2.c \ + pickit2.h \ + pindefs.c \ + ppi.c \ + ppi.h \ + ppiwin.c \ + safemode.c \ + serbb.h \ + serbb_posix.c \ + serbb_win32.c \ + ser_avrdoper.c \ + ser_posix.c \ + ser_win32.c \ + solaris_ecpp.h \ + stk500.c \ + stk500.h \ + stk500_private.h \ + stk500v2.c \ + stk500v2.h \ + stk500v2_private.h \ + stk500generic.c \ + stk500generic.h \ + tpi.h \ + usbasp.c \ + usbasp.h \ + usbdevs.h \ + usb_hidapi.c \ + usb_libusb.c \ + usbtiny.h \ + usbtiny.c \ + update.c \ + wiring.h \ + wiring.c +libavrdude_la_SOURCES = $(libavrdude_a_SOURCES) +libavrdude_la_LDFLAGS = -version-info 1:0 + +include_HEADERS = libavrdude.h + +avrdude_SOURCES = \ + main.c \ + term.c \ + term.h + +man_MANS = avrdude.1 + +sysconf_DATA = avrdude.conf + +install-exec-local: backup-avrdude-conf + +distclean-local: + rm -f avrdude.conf + +# This will get run before the config file is installed. +backup-avrdude-conf: + @echo "Backing up avrdude.conf in ${DESTDIR}${sysconfdir}" + @if test -e ${DESTDIR}${sysconfdir}/avrdude.conf; then \ + cp -pR ${DESTDIR}${sysconfdir}/avrdude.conf \ + ${DESTDIR}${sysconfdir}/avrdude.conf.bak; \ + fi + +ACLOCAL_AMFLAGS = -I m4 diff --git a/xs/src/avrdude/NEWS b/xs/src/avrdude/NEWS new file mode 100644 index 000000000..ced93cd35 --- /dev/null +++ b/xs/src/avrdude/NEWS @@ -0,0 +1,913 @@ +$Id$ + +Approximate change log for AVRDUDE by version. + +(For more detailed changes, see the ChangeLog file.) + +---------------------------------------------------------------------- +Current: + + * Major changes compared to the previous version: + + - libhidapi support (part of patch #8717) + - use libhidapi as (optional) transport for CMSIS-DAP compliant + debuggers (JTAGICE3 with firmware 3+, AtmelICE, EDBG, mEDBG) + + * New devices supported: + + * New programmers supported: + + - ehajo-isp (commercial version of USBtiny) + + * Bugfixes: + bug #47550: Linux GPIO broken + + * Internals: + + +Version 6.3: + + * Major changes compared to the previous version: + + - Backout of + patch #8380: adds 500k 1M 2M baud to ser_posix.c + It broke the functionality in too many situations + (bug #46610/46483) + + * New devices supported: + + - ATmega48PB, ATmega88PB, ATmega168PB + - ATtiny28 (HVPP-only device) + + * New programmers supported: + + - Atmel mEDBG: xplainedmini, xplainedmini_dw + + * Bugfixes + + - bug #46610: Floating point exception (core dumped) arch linux rpi2 + - bug #46483: version 6.2. ser_open(): can't set attributes for device + - patch #8435: Implementing mEDBG CMSIS-DAP protocol + - patch #8735: ATtiny28 support in avrdude.conf + - patch #8896: Silence cppcheck warnings in 6.2 code + - patch #8895: Spelling in 6.2 code + + +Version 6.2: + + * Major changes compared to the previous version: + + - The stk500v2 implementation now uses its own higher-level + command implementation for byte-wide access, rather than the + historic SPI_MULTI command where all the low-level ISP + implementation had to be assembled manually inside AVRDUDE. In + addition to the traditional STK500, this implementation is also + used by all the more modern Atmel tools (AVRISPmkII, JTAGICEmkII + in ISP mode, STK600 in ISP mode). + + - The -B option can be suffixed with "Hz", "kHz", or "MHz", in + order to specify a bitclock frequency rather than period. + + - Print part id after signature (patch #8440 ) + + - buspirate: Also support "cpufreq" extended parameter + in binary mode (patch #8504 ) + + - The "-P net:" syntax (forwarding of serial data over TCP) is now + also implemented for Win32 systems. + + - Allow for arbitrary serial baudrates under Linux (OSX and *BSD + could already handle it). + + + * New devices supported: + - AT90PWM216 (bug #42310: New part description for AT90PWM216) + - ATmega32M1 (patch #7694 Add support for the atmega32m1) + + * New programmers supported: + - ftdi_syncbb + + uncompatino, ttl232r (FTDI TTL232R-5V with ICSP adapter) + (patch #8529 2 more ftdi_syncbb devices) + + * Bugfixes + - bug #45727: Wrong atmega8u2 flash parameters + - bug #46020: Add TIAO TUMPA to the conf file. + - bug #46021: Please add read in the memory lock section of ATtiny85 + - bug #42337 avrdude.conf updates for UM232H/CM232H + - bug #42056: double free or corruption triggered at exit + - bug #42158: Linux GPIO - Source Typo + - bug #42516 spelling-error-in-binary + - patch #8419 fix ftdi_syncbb hang with libftdi 1 + - bug #43002 usbasp debug output typo + - patch #8511 Fix reset on FT245R + - bug #40142 Floating point exception on Ubuntu 10.04 + - bug #22248: Read efuse error (partial fix) + - bug #42267: jtag3isp fails to read lock and fuse bytes directly + after changing lock byte + - bug #41561: AVRDUDE 6.0.1/USBasp doesn't write first bytes of + flash page + - bug #43078: AVRDUDE crashes after sucessfully reading/writing eeprom + - bug #43137: Writing and reading incorrect pages when using jtagicemkI + - bug #40870: config nitpick: ATtiny25/45/85 have 1 calibration byte not 2 + - bug #42908: no external reset at JTAGICE3 + - patch #8437: [PATCH] Serial-over-ethernet for Win32 + - bug #44717: avrdude creates empty flash dump + + * Internals: + - Removing exit calls from config parser + - bug #42662 clang warnings under FreeBSD 10.x + +Version 6.1: + + * Major changes compared to the previous version: + - Atmel EDBG protocol support added (JTAGICE3, XplainedPro, Atmel-ICE) + + * New programmers supported: + - Atmel DFU, using FLIP protocol version 1 (AT90USB and ATmega*U* devices), + or version 2 (Xmega devices) + - Atmel-ICE (ARM/AVR), JTAG, PDI, debugWIRE, ISP modi + + * Bugfixes + - bug #40055: AVRDUDE segfaults when writing eeprom + - bug #40085: Typo fix in fuses report (for 6.1-svn-20130917) + - bug #40782: Verify errors for object size > 16 k on x32e5 due + to typo in avrdude.conf + - bug #40817: Elf file support (possibly) not working on 6.0.1 windows build + - bug #40897: AT Mega2560 not correctly programmed with stk500(v1) + ISP (solution patch) + - bug #41357: OS X: Avrdude messes with the usb stack? + - bug #41402: dfu.c missing include + - patch #7896: DFU FLIPv2 programming support + - patch #XXXX: xxx + + * Internals: + - (Some) programmers can take a list of USB PIDs now. + + +Version 6.0: + + * Major changes compared to the previous version: + + - Programmer types in configuration file are no longer keywords but + specified as string. + + So you need to change 'type = XYZ;' to 'type = "XYZ";' in own + config files. (internal: The parser does not need to know all + programmer types now, new programmers will update only the table + in pgm_type.c.) + + - The erase cycle counter (formerly options -y / -Y) has been + removed. + + - Specifying a -U option without a memory type (short form of + option argument list) now defaults to "application" memory for + Xmega devices, and "flash" for everything else. This ensures + the Xmega bootloader is not accidentally touched. + + - For programmers that support it, the default erase method is a + page erase now, rather than a chip erase (Xmega only). + + - Keep track of input file contents + + Memory segments are being tracked to remember whether they've + been actually read from a file. Only segments that came from a + file are being programmed into the device, or considered for + verification. This drastically improves handling speed for + sparse files (e.g. files that have a second bootloader segment), + and it ensures the device contents is actually compared for + everything mentioned in the file (even in case the file has + large 0xFF blocks). + + - The -U option now accepts ELF files as input files, and extracts + the appropriate section contents that matches the requested memory + region. To enable this feature, the host system used for the + compilation must have a libelf around, including the respective + header files (i.e., package "libelf-devel" on many Linux systems). + + - Programmers and parts lists + + They are now sorted at output with '-c ?'/'-p ?'. (patch #7671: + Sorting programmers and parts lists for console output) + + Programmers and parts lists in documentation generated from lists + mentioned above. (patch #7687: Autogenerating programmers and + parts lists for docs) + + Output list of programmer types with '-c ?type', add list to + documentation + + - Configuration files now accepts parent parts/programmers, parts + starting with '.' (eg. .xmega) are not included in output parts + list and can be used as abstract parents + + (bug #34302: Feature request : device configuration with parent classes) + (patch #7688: Implement parent programmers feature) + + - Additional config files which are read after default can be + specified on command line using '-C +filename' + + (patch #7699 Read additional config files) + + - "Safemode" can now be turned off by default from within a + configuration file (like ~/.avrduderc). + + - The new option -l logfile allows to redirect diagnostic messages + to a logfile rather than stderr. Useful to record debugging + traces, in particular in environments which do not offer + shell-style redirection functionality for standard streams. + + - When leaving debugWIRE mode, immediately retry with ISP rather + than bailing out completely. + + - The USBasp programmer implementation now supports detailed traces + with -vvv, and device communication traces with -vvvv. + + - The "verbose" terminal mode command allows to query or modify the + verbosity level. + + * New devices supported: + - ATmega48P (patch #7629 add support for atmega48p) + - AT90PWM316 (bug #21797: AT90PWM316: New part description) + - ATxmega16D4, ATxmega32D4, ATxmega64D4, ATxmega128D4 + - ATmega256RFR2, ATmega128RFR2, ATmega64RFR2, ATmega2564RFR2, + ATmega1284RFR2, ATmega644RFR2 + - ATtiny1634 + - ATxmega128A1U, ATxmega128A3U, ATxmega128A4U, ATxmega128B1, + ATxmega128B3, ATxmega128C3, ATxmega128D3, ATxmega16A4U, + ATxmega16C4, ATxmega192A3U, ATxmega192C3, ATxmega192D3, + ATxmega256A3BU, ATxmega256A3U, ATxmega256C3, ATxmega256D3, + ATxmega32A4U, ATxmega32C4, ATxmega384C3, ATxmega384D3, + ATxmega64A1U, ATxmega64A3U, ATxmega64A4U, ATxmega64B1, + ATxmega64B3, ATxmega64C3, ATxmega64D3 + - ATtiny43U + - ATmega406 + - ATxmega8E5, ATxmega16E5, ATxmega32E5 + - ATtiny20, ATtiny40 + + + * New programmers supported: + - linuxgpio + + any (embedded) Linux system with 4 GPIOs available can be used + as a programmer with little or no additional hardware. + + - avrftdi + + o-link (patch #7672 adding support for O-Link (FTDI based + JTAG) as programmer) + + 4232h (patch #7715 FT4232H support) + - TPI support + + openmoko (bug #37977 Support for Openmoko Debug Board) + + - usbasp + + nibobee (previously specified as '-c usbasp -P nibobee) + + usbasp-clone (same as usbasp but ignores vendor and product + string, checks only vid/pid) + + - ftdi_syncbb (new type for synchronous bitbanging with ft232r/ft245r) + + ft245r (FT245R Synchronous BitBang, miso = D1, sck = D0, mosi + = D2, reset = D4) + + ft232r (FT232R Synchronous BitBang, miso = RxD, sck = RTS, + mosi = TxD, reset = DTR) + + bwmega (BitWizard ftdi_atmega builtin programmer, miso = DSR, + sck = DCD, mosi = CTS, reset = RI) + + arduino-ft232r (Arduino: FT232R connected to ISP, miso = CTS + X3(1), sck = DSR X3(2), mosi = DCD X3(3), reset = RI X3(4)) + + diecimila (alias for arduino-ft232r) + + - pickit2 + + - Atmel JTAGICE3 + + - buspirate_bb (TPI programming using the BusPirate in bitbang mode) + + * Bugfixes + - bug #34027: avrdude AT90S1200 Problem + - bug #34518: loading intel hex files > 64k using record-type 4 + - patch #7667: Minor memory handling fixes + - patch #7680: Fixing timeout problem in ser_recv in ser_win32.c + - patch #7693: Fix config file atmel URLs (+ URLs in + avrdude.texi and avrpart.h) + - bug #21663: AT90PWM efuse incorrect, bug #30438: efuse bits + written as 0 on at90pwmxx parts + - bug #35261: avrftdi uses wrong interface in avrftdi_paged_(write|load) + - patch #7437 modifications to Bus Pirate module + - patch #7686 Updating buspirate ascii mode to current firmware, + use AUX as clock generator, and setting of serial receive + timeout + - bug #34768 Proposition: Change the name of the AVR32 devices + - patch #7718: Merge global data of avrftdi in a private data + structure + - bug #35208: avrdude 5.11 on freebsd 8.2-STABLE does not reset + Arduino Uno properly + - bug #34518: loading intel hex files > 64k using record-type 4 + (Extended Linear Address Record) + - bug #34027: avrdude AT90S1200 Problem + - bug #30451: Accessing some Xmega memory sections gives not + supported error + - bug #28744: Can't load bootloader to xmega128a1 + - bug #29019: pagel/bs2 warning when uploading using stk500 to xmega + - bug #30756: When setting SUT to 64ms on XMEGA, avrdude doesn't + read device signature + - bug #37265: wrong page sizes for XMega64xx in avrdude.conf + - bug #37942: Latest SVN can't program in dragon_jtag mode + - patch #7876 JTAGICE mkII fails to connect to attiny if debugwire + is enabled AND target has a very slow clock + - bug #39893: Verification failure with AVRISPmkII and Xmega + - bug #38713: Compilation of the documentation breaks with texinfo-5 + - bug #38023: avrdude doesn't return an error code when attempting + to upload an invalid Intel HEX file + - bug #39794: warnings when building avrdude 6.0rc1 under CentOS 6.4 + - bug #35800: Compilation error on certain systems if parport is disabled + - bug #38307: Can't write usersig of an xmega256a3 + - bug #38580: Current svn head, xmega and fuses, all fuses tied to fuse0 + - bug #39691: Buffer overrun when reading EEPROM byte with JTAGICE3 + - bug #38951: AVR109 use byte offset instead of word offset + - patch #7769: Write flash fails for AVR910 programmers + - bug #38732: Support for ATtiny1634 + - bug #36901: flashing Atmega32U4 EEPROM produces garbage on chip + - bug #28344: chip_erase_delay too short for ATmega324P, 644, 644P, and 1284P + - bug #34277: avrdude reads wrong byte order if using avr911 (aka butterfly) + - bug #35456: The progress bar for STK500V2 programmer is "wrong". + - patch #5708: avrdude should make 10 synchronization attempts instead of just one + - patch #7606: ATtiny43u support + - patch #7657: Add ATmega406 support for avrdude using DRAGON + JTAG + - bug #35474: Feature request: print fuse values in safemode output. + - patch #7710: usb_libusb: Check VID/PID before opening device + - [no-id]: Fix SCK period adjustment for STK500v2 + - bug #40040: Support for ATtiny20 and ATtiny40 + + * Internals: + + - Restructuring and compacting programmer definition part of + grammar for config file. + - Cleanup of parser code, removing unused definitions/ + functions. Using yylex_destroy if available. + - Fixed some more memory leaks, added cleanup code at program exit + (to minimize the number of non-freed memory blocks reported by + valgrind) + - Fixed some findings reported by cppcheck. + +Version 5.11: + + * New devices supported: + - ATmega88P/168P + - ATmega8U2/16U2/32U2 + - ATtiny4313 + + * New programmers supported: + - TPI programming through bitbang programmers (both, serial + and parallel ones) + - FT2232 (and relatives) based programmers (MPSSE bitbang mode) + - Wiring environment (http://wiring.org.co/) + - butterfly-style bootloader of the Mikrokopter.de device + + * Bugfixes + + +Version 5.10: + + * Bugfixes + - bug #28660: Problem with loading intel hex rom files that exceed + 0x10000 bytes + - see ChangeLog for further details + + * New Features + - (JTAG ICE / AVR Dragon) apply external reset if JTAG ID could + not be read + +Version 5.9: + + * New devices supported: + + - AVR32A0512 (JTAGMKII only) + - ATmega32U4 + - ATtiny4 + - ATtiny5 + - ATtiny9 + - ATtiny10 + + * New programmers supported: + + - BusPirate + - Arduino + - JTAGICEmkII and AVR Dragon in PDI mode (ATxmega devices) + - STK600 and AVRISP mkII in TPI mode (ATtiny4/5/9/10) + + * Bugfixes + + - see ChangeLog and ChangeLog-2009 for details + +Version 5.8: + + * Bugfixes; most importantly, fix a serious memory corruption for + that JTAG ICE mkII and AVR Dragon in ISP/HVSP/PP mode. + +Version 5.7: + + * New devices supported: + + - ATXMEGA64A1 + - ATXMEGA192A1 + - ATXMEGA256A1 + - ATXMEGA64A3 + - ATXMEGA128A3 + - ATXMEGA192A3 + - ATXMEGA256A3 + - ATXMEGA256A3B + - ATXMEGA16A4 + - ATXMEGA32A4 + - ATXMEGA64A4 + - ATXMEGA128A4 + + * Major Xmega fixes for the JTAG ICE mkII (patch #6825) + + * Bugfixes. + +Version 5.6: + + * New devices supported: + + - AT90USB82 + - AT90USB162 + - ATtiny88 + - ATmega328P + - ATmega1284P + - ATmega128RFA1 + - ATxmega128A1 rev D + - ATxmega128A1 + - ATxmega256A3 + + * New programmers supported: + + - AT89ISP cable (patch #6069) + - Arduino + + * Add support for the -x option to pass extended parameters to the + programmer backend. + + * Add support for JTAG daisy-chains, using the -x daisychain= + option. + + * Add support for the Atmel STK600 for "classic" AVRs (AT90, ATtiny, + ATmega), using either ISP or high-voltage programming modes. + + * Add support for the -x devcode extended parameter to the avr910 + programmer, to allow overriding the device code sent to the + programmer. + + * Add support for the Crossbow MIB510 programmer (patch #6074, #6542). + + * Add support to bootstrap with GNU autoconf 2.61, and automake 1.10, + respectively. + + * Add support for ATxmega128A1 (including the revision D engineering + samples) for STK600 and AVRISPmkII tools using PDI + + * The option combination -tF now enters terminal mode even if the + device initialization failed, so the user can modify programmer + parameters (like Vtarget). + + * Add preliminary support for ATxmega128A1 for the JTAG ICE mkII using + JTAG. + + * Add support for direct SPI transfers (bug #25156). + + * Bugfixes. + +Version 5.5: + + * Add support for the USBtinyISP programmer (patch #6233) + + * Add support for the C2N232I serial bitbang programmer (patch #6121) + + * Bugfixes. + +Version 5.4: + + * New devices supported: + + - AT90PWM2B/AT90PWM3B + + * Bugfixes. + + * Source code rearranged so that the functionality is now built + into a libavrdude.a library where main.c is currently the only + existing frontend. + + * Implement ATmega256x support for butterfly/avr109. + +Version 5.3.1: + + * Add support for the AVR Dragon (all modes: ISP, JTAG, HVSP, PP, + debugWire). + + * Add support for debugWire (both, JTAG ICE mkII, and AVR Dragon). + + * Add support for the AVR Doper USB HID-class programmer. + + * Bugfixes. + +Version 5.2: + + * New devices supported: + + - AT90USB646/647/1286/1287 + - ATmega2560/2561 + - ATmega325/3250/645/6450 + - ATtiny11 (HVSP only device) + - ATtiny261/461/861 + + * Fixed paged flash write operations for AT90PWMx devices + (error in datasheet). + + * Add signature verification. + + * Add high-voltage mode programming for the STK500 (both, + parallel, and high-voltage serial programming). + + * Add support for using the JTAG ICE mkII as a generic ISP + programmer. + + * Allow for specifying the ISP clock delay as an option for + bit-bang programming adapters. + + * Add support for Thomas Fischl's USBasp low-cost USB-attached + programmer. + + * The "stk500" programmer type is now implemented as a stub + that tries to probe for either "stk500v1" or "stk500v2". + + * Many bugfixes. + +Version 5.1: + + * New devices supported: + + - ATmega640/1280/1281 + - ATtiny24/44/84 + + * JTAG mkII support now works with libusb-win32, too + + * JTAG ICE mkI support has been added + + * Solaris support has been added (including ecpp(7D) parallel-port + bit-bang mode) + + +Version 5.0: + + * Support for JTAGICE MkII device + + * Support for STK500 Version 2 Protocol + + * New devices supported: + + - AT90CAN128 + - ATmega329x/649x + - ATmega164/324/644 + - AT90PWM2/3, + - ATmega164/324/644 + - ATmega329x/649x + - ATtiny25/45/85 + + * Support for serial bit-bang adapters: Ponyprog serial, UISP DASA, + UISP DASA3. + + * DAPA programmer pinout supported + + * New "safemode" feature where fuse bits are verified before exit + and if possible recovered if they have changed. This is intended + to protect against changed fuses which were not requested which is + reported to sometimes happen due to improper power supply or other + reasons. + + * Various fixes for avr910 and butterfly programmers + + * Full support for AVR109 boot loaders (butterfly) + + * Adding -q -q suppresses most terminal output + + +Version 4.4.0: + + * Native Win32 support: The windows build doesn't need Cygwin + anymore. Additionally, the delay timing on windows should be + more accurate now. + Contributed by Martin Thomas + + * Add support for + - ATmega48, ATmega88 (contributed by Galen Seitz) + - ATtiny2313 (contributed by Bob Paddock) + - ATtiny13 (contributed by Pawel Moll) + + * Added command to change the SCK of STK500-programmers. Now it + is possible to program uC with slow oscillator. + Contributed by Galen Seitz + + * Baudrate for serial programmers (STK500 and AVR910) is + configurable in the config or at the command-line. + This way some more tweaked bootloaders and programmers can be used. + + * Deprecated options have been removed. + Now the "-U" option must be used. + + * MacOS X now supported by default. + +Version 4.3.0: + + * Added support for "Butterfly" evaluation board. + + * Make cycle-count work with AVR910-programmers. + + * Added "Troubleshooting"-Appendix to the manual. + + * Add ATmega8515 support. + Contributed by: Matthias Weier + + * Add ATmega64 support. + Contributed by: Erik Christiansen + + * Improved polling algorithm to speed up + programming of byte oriented parallel programmers. + Contributed by: Jan-Hinnerk Reichert + + * Add "fuse" and "lock" definitions for the AT90S8535. + + * STK500 skips empty pages in paged write resulting in faster downloads + when there are empty blocks in between code (such as files that contain + application code and bootloader code). + +Version 4.2.0: + + * Add basic support for reading and writing fuses via SPI with avr910 + programmers. Submitted by + Jan-Hinnerk Reichert . + + * Perform an auto erase before programming if the flash memory is + anywhere specified to be written by any of the -U requests. Old + style memory specification options (-f, -i, -I, -m, and -o) are + deprecated in favor of the new -U options. Auto erase is disabled + if any of the old-style options (specifically -i and -o) are + specified. + + * Add new -U option for specifying programming operations - allows + multiple memory operations on a single command line. + + * New progress reporting, looks nicer and is nicer to wrapper + environments such as emacs. + + * Fix long-standing timing (verify) problems on Windows platform. + Submitted by Alex Shepherd . + + * Add new file format option - 'm' for "immediate mode." In this + case, the filename argument of the -o, -i, or -U options is + treated as the data for uploading - useful for specifying fuse + bits without having to create a single-byte file for uploading. + + * Add support for displaying and setting the various STK500 operational + parameters (Vtarget, Varef, Master clock). + + * Add 'picoweb' programming cable programmer. + Contributed by Rune Christensen . + + * Add support for the sp12 programmer. Submitted by + Larry Barello . + + +Version 4.1.0 + + * Add support for the Bascom SAMPLE programmer. Submitted by + Larry Barello . + + * Add support for avr910 type programmers (mcu00100, pavr avr910, etc). + + * Support new devices: ATmega8535, ATtiny26 + + +Version 4.0.0 + + * Now support Linux - added by "Theodore A. Roth" . + + * Now support Windows - added by "Eric B. Weddington" . + + * Use 'configure' scripts to tailor the code to the system avrdude + is getting ready to be compiled on - added by "Theodore A. Roth" + . + + * Motorola S-Record support - submitted by "Alexey V.Levdikov " + . + + * Support parallel programming on the STK500. Introduce 'pagel' and + 'bs2' keywords to the config file for this purpose. + + * Add support for the AT90S2343 + + * Add support for the ATmega169 + + * Add ability to specify system defaults within the config file + (default parallel port, default serial port). + + * Specify the default programmer seperately from the programmer + definition. This is now done in the config file using the + 'default_programmer' keyword. + + * Support a per-user config file (~/.avrduderc) so that one can + override system wide defaults if desired. + + * Follow the datasheet more closely for several parts in the "retry" + code when entering programming mode fails initially. Introduce + 'retry_pulse' to the config file for this purpose. + + + +Version 3.1.0 + + * This change represents a name change only. There is currently an + effort to port AVRPROG to other platforms including Linux and + Windows. Since Atmel's programmer binary that's included within + their AVR Studio software is named AVRPROG.EXE on the Windows OS, + there is the chance for confusion if we keep calling this program + AVRPROG as well. Up until now the name hasn't really been a + problem since there was no chance to confuse 'avrprog' on Unix + with Atmel's AVRPROG because Atmel's tools only run on Windows. + But with the Unix 'avrprog' possibly being ported to Windows, I + felt a name change was the best way to avoid problems. + + So - from this point forward, my FreeBSD Unix program formerly + known as AVRPROG will subsequently be known as AVRDUDE (AVR + Downloader/UploaDEr). + + This change also represents a time when the AVRDUDE sources move + from my own private repository to a public repository. This will + give other developers a chance to port AVRDUDE to other platforms + and extend its functionality to support additional programming + hardware, etc. + + So goodbye AVRPROG, welcome AVRDUDE! + +Version 3.0.0 + + * Rewrite parts of the code to make it easy to support other types + of programmers besides the directly connected parallel port + programmer (PPI). + + * Add support for Atmel's STK500 programmer/development board. The + STK500's "paged mode" read/write is supported which makes this + programmer very fast. This is sorely needed on parts with large + memories such as the ATmega128. My 12K test program burns in + about 5 seconds, add another 5 to read it back out for + verification. + + +Version 2.1.5: + + * When getting ready to initiate communications with the AVR device, + first pull /RESET low for a short period of time before enabling + the buffer chip. This sequence allows the AVR to be reset before + the buffer is enabled to avoid a short period of time where the + AVR may be driving the programming lines at the same time the + programmer tries to. Of course, if a buffer is being used, then + the /RESET line from the programmer needs to be directly connected + to the AVR /RESET line and not via the buffer chip. + + Feature contributed by Rick C. Petty . + + * When in interactive terminal mode and dumping memory using the + 'dump ' command without any address information, and the + end of memory is reached, wrap back around to zero on the next + invocation. + + +Version 2.1.4: + + * Fix -Y option. + + +Version 2.1.3: + + * Be backward compatible when reading 2-byte rewrite cycle counters + as written by avrprog version 2.1.0. Version 2.1.1 changed over + to a 4-byte counter, which caused avrprog versions 2.1.1 and 2.1.2 + to report a negative count for parts that were initialized using + version 2.1.0. Thanks to Joerg Wunsch for noticing this. + + +Version 2.1.2: + + * Add '-V' option to disable automatic verify check with uploading + data. + + +Version 2.1.1: + + * Fix ATmega128 instruction sequences for reading fuse bits - + contributed by Joerg Wunsch. + + * Modify erase-rewrite cycle counter code to use a 4 byte counter + instead of a two byte counter. + + +Version 2.1.0: + + * Implement a per-part erase-rewrite cycle counter; requires the use + of two bytes of EEPROM memory. + + +Version 2.0.5: + + * Support for ATtiny15 - contributed by Asher Hoskins + + +Version 2.0.4: + + * Config file fixes for various parts. + + +Version 2.0.3: + + * Work around problem programming fuse bits on parts like the + at90s4433 as described in the following errata: + + http://www.atmel.com/atmel/acrobat/doc1280.pdf + + * Add part definition for at90s4414, at90s4433. + + * Add fuse/lock bit memory instructions for the at90s1200, + at90s2333, at90s4433 and at90s8515. + + * Fix setting of programmer status LEDs under certain write-fail + conditions. + + +Version 2.0.2 : + + * Fix writing to read-only memories such as the lock bits of the + AT90S2313. + + * Copyright updates. + + +Version 2.0.1 : + + * Use correct parallel port pins for VCC. + + * Add programmer definition for Atmel's STK200. + + * Add programmer definition for the AVR3 board. + + * Fix address bit encoding for many parts. + + * Allow the ``BUFF'' signal to be asserted by multiple pins of the + parallel port (like VCC) instead of just one. The STK200 appears + to need this feature. + + +Version 2.0.0 : + + * Add support for programming fuse and lock bits if supported by the + part. + + * Move instruction encoding into the config file. Now any part can + be supported as long as it uses the same basic serial programming + instruction format. + + * Add part definitions for the ATMega163 and ATMega8 devices. + + +Version 1.4.3 : + + * Mostly internal code cleanup. + + +Version 1.4.2 : + + * Fixes for ATMega paged memory support. + + * Support for ATMega16 device. + + +Version 1.4.1 : + + * No functional changes, update to Copyrights only. + + +Version 1.4.0 : + + * Add part definitions to the config file. + + * Add initial support for Atmel's ATMega paged memory parts. + + * Config file documentation added. + + * Add a definition for the Dontronics DT006 programmer. + + * Fix Intel Hex support for addresses larger than 64k. + + +Version 1.3.0 : + + * Make programmer pin assignments configurable. + + +Version 1.2.2 : + + * Initial public release. diff --git a/xs/src/avrdude/README b/xs/src/avrdude/README new file mode 100644 index 000000000..2ca0009a3 --- /dev/null +++ b/xs/src/avrdude/README @@ -0,0 +1,64 @@ +THIS IS A PRUSA3D BRANCH, WORKING AROUND A SPECIFIC PROBLEM +IN THE EARLY I3 MK2 USB COMMUNICATION CHIPS. + +Some of the early Prusa3D i3 MK2 printers were shipped with a buggy +USB communication controller firmware. This fork of avrdude contains +a workaround inside the stk500v2 protocol implementation. + +The workaround depends on a specific behavior of the Arduino AVR 2560 +bootloader, which is installed on the i3 MK2 printers: + +https://github.com/arduino/Arduino-stk500v2-bootloader + +The avrdude binary modified by Prusa3D could replace the avrdude bianary +of arduino to program the RAMBo board. In that case the modified binary +is identified by a "-prusa3d" suffix to the version information. + +------------------------------------------------------------------- + +See the documentation file for the details. + +The latest version of AVRDUDE is always available here: + + http://savannah.nongnu.org/projects/avrdude + + +Important environment variables for ./configure: +================================================ + +CPPFLAGS: C preprocessor flags (*not* "C++") + +This is the place to put additional (non-standard) -I options into. +For example, if your Windows system has LibUSB-Win32 installed into +\\WINDOWS\ProgramFiles\LibUSB-Win32, use + +CPPFLAGS=-I/WINDOWS/ProgramFiles/LibUSB-Win32/include + +to tell configure where to search for the header files. (The use of +forward slashes rather than backslashes can often simplify things. +Note that the Windows system services internally treat both the same. +It's only cmd.exe which requires backslashes as the directory +separator.) + +LDFLAGS: Linker options + +This is the place to make additional library locations known to the +linker. To continue the above example, use + +LDFLAGS=-L/WINDOWS/ProgramFiles/LibUSB-Win32/lib/gcc + +to make the linker search for "libusb.a" in that directory. + + +Linux users: make sure the header files are installed +===================================================== + +While many Linux distributions install the libraries needed by AVRDUDE +(libusb, libelf) by default, they leave out the corresponding header +files. Consequently, the configure script won't find them, so these +libraries could not be used. + +Usually, the packages with the header files (and static libraries) are +derived from the regular package name by appending "-devel". Thus, +make sure you have "libusb-devel" and "libelf-devel" installed before +running the configure script. (Same goes for libftdi.) diff --git a/xs/src/avrdude/ac_cfg.h b/xs/src/avrdude/ac_cfg.h new file mode 100644 index 000000000..881c60e00 --- /dev/null +++ b/xs/src/avrdude/ac_cfg.h @@ -0,0 +1,195 @@ +/* ac_cfg.h. Generated from ac_cfg.h.in by configure. */ +/* ac_cfg.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DDK_HIDSDI_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_HIDAPI_HIDAPI_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define if ELF support is enabled via libelf */ +#define HAVE_LIBELF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LIBELF_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LIBELF_LIBELF_H */ + +/* Define if FTDI support is enabled via libftdi */ +/* #undef HAVE_LIBFTDI */ + +/* Define if FTDI support is enabled via libftdi1 */ +#define HAVE_LIBFTDI1 1 + +/* Define if libftdi supports FT232H, libftdi version >= 0.20 */ +/* #undef HAVE_LIBFTDI_TYPE_232H */ + +/* Define if HID support is enabled via the Win32 DDK */ +/* #undef HAVE_LIBHID */ + +/* Define if HID support is enabled via libhidapi */ +/* #undef HAVE_LIBHIDAPI */ + +/* Define to 1 if you have the `ncurses' library (-lncurses). */ +#define HAVE_LIBNCURSES 1 + +/* Define to 1 if you have the `readline' library (-lreadline). */ +#define HAVE_LIBREADLINE 1 + +/* Define to 1 if you have the `termcap' library (-ltermcap). */ +/* #undef HAVE_LIBTERMCAP */ + +/* Define if USB support is enabled via libusb */ +#define HAVE_LIBUSB 1 + +/* Define if USB support is enabled via a libusb-1.0 compatible libusb */ +#define HAVE_LIBUSB_1_0 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LIBUSB_1_0_LIBUSB_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LIBUSB_H */ + +/* Define to 1 if you have the `ws2_32' library (-lws2_32). */ +/* #undef HAVE_LIBWS2_32 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Linux sysfs GPIO support enabled */ +/* #undef HAVE_LINUXGPIO */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LUSB0_USB_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memset' function. */ +#define HAVE_MEMSET 1 + +/* parallel port access enabled */ +#define HAVE_PARPORT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PTHREAD_H 1 + +/* Define to 1 if you have the `select' function. */ +#define HAVE_SELECT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasecmp' function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strncasecmp' function. */ +#define HAVE_STRNCASECMP 1 + +/* Define to 1 if you have the `strtol' function. */ +#define HAVE_STRTOL 1 + +/* Define to 1 if you have the `strtoul' function. */ +#define HAVE_STRTOUL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_TERMIOS_H 1 + +/* Define to 1 if the system has the type `uint_t'. */ +/* #undef HAVE_UINT_T */ + +/* Define to 1 if the system has the type `ulong_t'. */ +/* #undef HAVE_ULONG_T */ + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_USB_H 1 + +/* Define to 1 if you have the `usleep' function. */ +#define HAVE_USLEEP 1 + +/* Define if lex/flex has yylex_destroy */ +#define HAVE_YYLEX_DESTROY 1 + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Name of package */ +#define PACKAGE "avrdude" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "avrdude-dev@nongnu.org" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "avrdude" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "avrdude 6.3-20160220" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "avrdude" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "6.3-20160220" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Version number of package */ +#define VERSION "6.3-20160220" + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#define YYTEXT_POINTER 1 + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ diff --git a/xs/src/avrdude/ac_cfg.h.in b/xs/src/avrdude/ac_cfg.h.in new file mode 100644 index 000000000..9dda33a53 --- /dev/null +++ b/xs/src/avrdude/ac_cfg.h.in @@ -0,0 +1,194 @@ +/* ac_cfg.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_DDK_HIDSDI_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the header file. */ +#undef HAVE_HIDAPI_HIDAPI_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if ELF support is enabled via libelf */ +#undef HAVE_LIBELF + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBELF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBELF_LIBELF_H + +/* Define if FTDI support is enabled via libftdi */ +#undef HAVE_LIBFTDI + +/* Define if FTDI support is enabled via libftdi1 */ +#undef HAVE_LIBFTDI1 + +/* Define if libftdi supports FT232H, libftdi version >= 0.20 */ +#undef HAVE_LIBFTDI_TYPE_232H + +/* Define if HID support is enabled via the Win32 DDK */ +#undef HAVE_LIBHID + +/* Define if HID support is enabled via libhidapi */ +#undef HAVE_LIBHIDAPI + +/* Define to 1 if you have the `ncurses' library (-lncurses). */ +#undef HAVE_LIBNCURSES + +/* Define to 1 if you have the `readline' library (-lreadline). */ +#undef HAVE_LIBREADLINE + +/* Define to 1 if you have the `termcap' library (-ltermcap). */ +#undef HAVE_LIBTERMCAP + +/* Define if USB support is enabled via libusb */ +#undef HAVE_LIBUSB + +/* Define if USB support is enabled via a libusb-1.0 compatible libusb */ +#undef HAVE_LIBUSB_1_0 + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBUSB_1_0_LIBUSB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBUSB_H + +/* Define to 1 if you have the `ws2_32' library (-lws2_32). */ +#undef HAVE_LIBWS2_32 + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Linux sysfs GPIO support enabled */ +#undef HAVE_LINUXGPIO + +/* Define to 1 if you have the header file. */ +#undef HAVE_LUSB0_USB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* parallel port access enabled */ +#undef HAVE_PARPORT + +/* Define to 1 if you have the header file. */ +#undef HAVE_PTHREAD_H + +/* Define to 1 if you have the `select' function. */ +#undef HAVE_SELECT + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strncasecmp' function. */ +#undef HAVE_STRNCASECMP + +/* Define to 1 if you have the `strtol' function. */ +#undef HAVE_STRTOL + +/* Define to 1 if you have the `strtoul' function. */ +#undef HAVE_STRTOUL + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_TERMIOS_H + +/* Define to 1 if the system has the type `uint_t'. */ +#undef HAVE_UINT_T + +/* Define to 1 if the system has the type `ulong_t'. */ +#undef HAVE_ULONG_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_USB_H + +/* Define to 1 if you have the `usleep' function. */ +#undef HAVE_USLEEP + +/* Define if lex/flex has yylex_destroy */ +#undef HAVE_YYLEX_DESTROY + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Version number of package */ +#undef VERSION + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#undef YYTEXT_POINTER + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const diff --git a/xs/src/avrdude/arduino.c b/xs/src/avrdude/arduino.c new file mode 100644 index 000000000..566f56abd --- /dev/null +++ b/xs/src/avrdude/arduino.c @@ -0,0 +1,132 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2009 Lars Immisch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* $Id$ */ + +/* + * avrdude interface for Arduino programmer + * + * The Arduino programmer is mostly a STK500v1, just the signature bytes + * are read differently. + */ + +#include "ac_cfg.h" + +#include +#include +#include + +#include "avrdude.h" +#include "libavrdude.h" +#include "stk500_private.h" +#include "stk500.h" +#include "arduino.h" + +/* read signature bytes - arduino version */ +static int arduino_read_sig_bytes(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m) +{ + unsigned char buf[32]; + + /* Signature byte reads are always 3 bytes. */ + + if (m->size < 3) { + avrdude_message(MSG_INFO, "%s: memsize too small for sig byte read", progname); + return -1; + } + + buf[0] = Cmnd_STK_READ_SIGN; + buf[1] = Sync_CRC_EOP; + + serial_send(&pgm->fd, buf, 2); + + if (serial_recv(&pgm->fd, buf, 5) < 0) + return -1; + if (buf[0] == Resp_STK_NOSYNC) { + avrdude_message(MSG_INFO, "%s: stk500_cmd(): programmer is out of sync\n", + progname); + return -1; + } else if (buf[0] != Resp_STK_INSYNC) { + avrdude_message(MSG_INFO, "\n%s: arduino_read_sig_bytes(): (a) protocol error, " + "expect=0x%02x, resp=0x%02x\n", + progname, Resp_STK_INSYNC, buf[0]); + return -2; + } + if (buf[4] != Resp_STK_OK) { + avrdude_message(MSG_INFO, "\n%s: arduino_read_sig_bytes(): (a) protocol error, " + "expect=0x%02x, resp=0x%02x\n", + progname, Resp_STK_OK, buf[4]); + return -3; + } + + m->buf[0] = buf[1]; + m->buf[1] = buf[2]; + m->buf[2] = buf[3]; + + return 3; +} + +static int arduino_open(PROGRAMMER * pgm, char * port) +{ + union pinfo pinfo; + strcpy(pgm->port, port); + pinfo.baud = pgm->baudrate? pgm->baudrate: 115200; + if (serial_open(port, pinfo, &pgm->fd)==-1) { + return -1; + } + + /* Clear DTR and RTS to unload the RESET capacitor + * (for example in Arduino) */ + serial_set_dtr_rts(&pgm->fd, 0); + usleep(250*1000); + /* Set DTR and RTS back to high */ + serial_set_dtr_rts(&pgm->fd, 1); + usleep(50*1000); + + /* + * drain any extraneous input + */ + stk500_drain(pgm, 0); + + if (stk500_getsync(pgm) < 0) + return -1; + + return 0; +} + +static void arduino_close(PROGRAMMER * pgm) +{ + serial_set_dtr_rts(&pgm->fd, 0); + serial_close(&pgm->fd); + pgm->fd.ifd = -1; +} + +const char arduino_desc[] = "Arduino programmer"; + +void arduino_initpgm(PROGRAMMER * pgm) +{ + /* This is mostly a STK500; just the signature is read + differently than on real STK500v1 + and the DTR signal is set when opening the serial port + for the Auto-Reset feature */ + stk500_initpgm(pgm); + + strcpy(pgm->type, "Arduino"); + pgm->read_sig_bytes = arduino_read_sig_bytes; + pgm->open = arduino_open; + pgm->close = arduino_close; +} diff --git a/xs/src/avrdude/arduino.h b/xs/src/avrdude/arduino.h new file mode 100644 index 000000000..024d711b9 --- /dev/null +++ b/xs/src/avrdude/arduino.h @@ -0,0 +1,29 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2009 Lars Immisch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* $Id$ */ + +#ifndef arduino_h__ +#define arduino_h__ + +extern const char arduino_desc[]; +void arduino_initpgm (PROGRAMMER * pgm); + +#endif + + diff --git a/xs/src/avrdude/atmel-docs/AVR109.pdf b/xs/src/avrdude/atmel-docs/AVR109.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0942f44bcfddecee0875fef751fdb650a7e1fe7b GIT binary patch literal 94446 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 literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/AVR910.pdf b/xs/src/avrdude/atmel-docs/AVR910.pdf new file mode 100644 index 0000000000000000000000000000000000000000..585703aaceb08b079658a96222555eafa3489f89 GIT binary patch literal 224606 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 M|Nhf2KfinV7m(jh*Z=?k literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/AVRISPmkII-AVR069.pdf b/xs/src/avrdude/atmel-docs/AVRISPmkII-AVR069.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dc42549540a2b54611f00a5841fe37381fef4743 GIT binary patch literal 326430 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

%D|VohOta65Q@_KFM(=pGwH3KD$5*fGF4;7 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∾rqZPYH+kl5&r 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 literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/browserDetect.js b/xs/src/avrdude/atmel-docs/EDBG/common/browserDetect.js new file mode 100644 index 000000000..2a7aa08a4 --- /dev/null +++ b/xs/src/avrdude/atmel-docs/EDBG/common/browserDetect.js @@ -0,0 +1,116 @@ +var BrowserDetect = { + init: function () { + this.browser = this.searchString(this.dataBrowser) || "An unknown browser"; + this.version = this.searchVersion(navigator.userAgent) + || this.searchVersion(navigator.appVersion) + || "an unknown version"; + this.OS = this.searchString(this.dataOS) || "an unknown OS"; + }, + searchString: function (data) { + for (var i=0;i> Global +----------------------------------------------------------------------------------------------------*/ + +.grid_1, +.grid_2, +.grid_3 { + display:inline; + float: left; + position: relative; + margin-left: 1%; + margin-right: 1%; +} + +/* Grid >> Children (Alpha ~ First, Omega ~ Last) +----------------------------------------------------------------------------------------------------*/ + +.alpha { + margin-left: 0; +} + +.omega { + margin-right: 0; +} + +/* Grid >> 3 Columns +----------------------------------------------------------------------------------------------------*/ + + +.container_3 .grid_1 { + width:31.333%; +} + +.container_3 .grid_2 { + width:64.667%; +} + +.container_3 .grid_3 { + width:98.0%; +} + + + +/* Prefix Extra Space >> 3 Columns +----------------------------------------------------------------------------------------------------*/ + + +.container_3 .prefix_1 { + padding-left:33.333%; +} + +.container_3 .prefix_2 { + padding-left:66.667%; +} + + + +/* Suffix Extra Space >> 3 Columns +----------------------------------------------------------------------------------------------------*/ + + +.container_3 .suffix_1 { + padding-right:33.333%; +} + +.container_3 .suffix_2 { + padding-right:66.667%; +} + + + +/* Push Space >> 3 Columns +----------------------------------------------------------------------------------------------------*/ + + +.container_3 .push_1 { + left:33.333%; +} + +.container_3 .push_2 { + left:66.667%; +} + + + +/* Pull Space >> 3 Columns +----------------------------------------------------------------------------------------------------*/ + + +.container_3 .pull_1 { + left:-33.333%; +} + +.container_3 .pull_2 { + left:-66.667%; +} + + + + +/* Clear Floated Elements +----------------------------------------------------------------------------------------------------*/ + +/* http://sonspring.com/journal/clearing-floats */ + +.clear { + clear: both; + display: block; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; +} + +/* http://perishablepress.com/press/2008/02/05/lessons-learned-concerning-the-clearfix-css-hack */ + +.clearfix:after { + clear: both; + content: ' '; + display: block; + font-size: 0; + line-height: 0; + visibility: hidden; + width: 0; + height: 0; +} + +.clearfix { + display: inline-block; +} + +* html .clearfix { + height: 1%; +} + +.clearfix { + display: block; +} \ No newline at end of file diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/css/index.css b/xs/src/avrdude/atmel-docs/EDBG/common/css/index.css new file mode 100644 index 000000000..eb1b8c24f --- /dev/null +++ b/xs/src/avrdude/atmel-docs/EDBG/common/css/index.css @@ -0,0 +1,59 @@ +body { + font-size: 12px; + font-family: Verdana, Geneva, sans-serif; +} + +.a { + text-decoration: none; +} + +.title { + padding: 31px 0 0 0; +} + +.group +{ + /*background-color: pink;*/ + width:966px; +} + +.group_header { + color: #0066CB; + font: bold 14pt IntervalLight, sans-serif; + text-decoration: none; + padding: 8px; + background-color: #EEEEEE; + margin-top: 24px; + /*margin-bottom: 8px;*/ +} + +.products +{ + float:left; + /*background:#FFF8F8;*/ +} + +.product { + /*background: url("../images/panelbg.png") 0 0 no-repeat;*/ + width: 300px; + height: 130px; + /*margin-left: 20px;*/ + padding: 10px; + border: 1px solid #EEEEEE; + display:block; + float: left; +} + +.product span { + font-size: 16px; + color: #0066CB; + margin-bottom: 8px; + clear:both; +} + +.product img +{ + margin-right:12px; + float:left; +} + diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/css/positioning.css b/xs/src/avrdude/atmel-docs/EDBG/common/css/positioning.css new file mode 100644 index 000000000..7c9658c41 --- /dev/null +++ b/xs/src/avrdude/atmel-docs/EDBG/common/css/positioning.css @@ -0,0 +1,493 @@ +tr th .added { color: #E6E6FA; } +tr th .changed {color: #99ff99; } +div.added tr, div.added { background-color: #E6E6FA; } +div.deleted tr, div.deleted { text-decoration: line-through; + background-color: #FF7F7F; } +div.changed tr, div.changed { background-color: #99ff99; } +div.off { } + +span.added { background-color: #E6E6FA; } +span.deleted { text-decoration: line-through; + background-color: #FF7F7F; } +span.changed { background-color: #99ff99; } +span.off { } + + +body { font: 12px Verdana, Geneva, sans-serif; } +p, ul, ol, li { font: 10pt Verdana, Geneva, sans-serif; } +h1 { font: 15pt Arial, Helvetica, geneva; + color: black!important; +} +h2 { font: normal 12pt Arial, Helvetica, geneva; } + +#header { + background: white; + position: fixed; + width: 100%; + height: 99px; + top: 0; + right: 0; + bottom: auto; + left: 0; + border-bottom: 1px solid #bbc4c5; + z-index: 2000; +} + +#header h1 { + margin-left: 310px; + position: fixed; + top: 20px; + left: -15px; + color: #404040 !important; +} + + +#header h1 { + margin-top: 2px; +} + + +p.breadcrumbs { + margin-top: 30px; + margin-left: 310px; +} + +#header img { + float: left; + margin-left: 20px; +} + +#header p.breadcrumbs a { + color: #bbb; +} + +#leftnavigation { + overflow: auto; + position: fixed; + height: auto; + top:100px; + /*right:10px;*/ + /*left:10px;*/ + bottom: 0; + left: 0; + width:inherit; + z-index: 1500; + border-right:2px solid #bbc4c5; + padding:1px; + background-color: #ededed!important; +} + +#treeDiv { + overflow: auto; + /* position: fixed;*/ + height: auto; + top: 136px; + bottom: 0; + left: 0; + /* width: 18%;*/ + z-index: 1500; + /* border-right:2px solid #CCCCCC; + background-color: #f0f0f0!important;*/ +} + +/*#searchDiv { + overflow: auto; + position: fixed; + height: auto; + top: 138px; + bottom: 0; + left: 0; + width: 243px; + z-index: 1500; + border-right:2px solid #CCCCCC; + background-color: #f0f0f0!important; +}*/ + +#content { + position: relative; + top: 90px; /*left: 240px;*/ + right: auto; bottom: 20px; + /*margin: 0px 0px 0px 280px;*/ + width: auto; + height: inherit; + padding-left: 5px; + padding-right: 30px; + border-left: 1px solid #cccccc; + overflow :scroll; + overflow-x:auto; + z-index: 1000; + +} + +#navheader { + position: fixed; + background: #DCDCDC; + padding-left: 10px; + right: 0px; + top: 10px; + text-align: right; +} + +#content h1, #content h2 { +color: #404040 !important; +font-size: 170%; +font-weight: normal; +} +.navfooter { bottom: 2%; } +.highlight { background-color: #c5d3c3; } +.highlightButton{ font-size: 0; } + +/* Show Hide TOC tree */ +.pointLeft { + padding-right: 15px; + display: block; + cursor: pointer; +} +.pointRight { + padding-right: 15px; + display: block; + cursor: pointer; +} + +/* Search results Styling */ +.searchExpression { + color: #0050A0; + background-color: #EBEFF8; + font-size: 12pt; +} +.searchresult li a { + text-decoration: none; + color: #0050A0; +} +.searchresult li { color: #0050A0; } +.shortdesclink { color: gray; font-size: 9pt; } +.searchText { float:left;width:150px; } +.searchButton { + padding: 2px 12px 2px 12px; + background-color:#bbb; + border:#bbb solid 1pt; + font-weight: bold; + font-size: 10pt +} +.searchButton:hover{ + background-color: #cccccc; +} +.searchFieldSet {} + +.title, div.toc>p{ font-weight: bold; } + +p.breadcrumbs { + display: inline; + margin-bottom: 0px; + margin-top: 33px; +} + +p.breadcrumbs a { + padding-right: 12px; + margin-right: 5px; + text-decoration: none; + color: #575757; + text-transform: uppercase; + font-size: 10px; +} + +p.breadcrumbs a:first-child {background: url(../images/breadcrumb-arrow-white.png) no-repeat right center;} + +p.breadcrumbs a:hover {text-decoration: underline;} + +#star ul.star { + LIST-STYLE: none; + MARGIN: 0; + PADDING: 0; + WIDTH: 85px; + /* was 100 */ + HEIGHT: 20px; + LEFT: 1px; + TOP: -5px; + POSITION: relative; + FLOAT: right; + BACKGROUND: url('../images/starsSmall.png') repeat-x 0 -25px; +} +#star li { + PADDING: 0; + MARGIN: 0; + FLOAT: right; + DISPLAY: block; + WIDTH: 85px; + /* was 100 */ + HEIGHT: 20px; + TEXT-DECORATION: none; + text-indent: -9000px; + Z-INDEX: 20; + POSITION: absolute; + PADDING: 0; +} +#star li.curr { + BACKGROUND: url('../images/starsSmall.png') left 25px; + FONT-SIZE: 1px; +} + +table.navLinks {margin-right: 20px;} + +table.navLinks td a { + text-decoration: none; + text-transform: uppercase; + color: black; + font-size: 11px; +} + +a.navLinkPrevious { + padding-left: 12px; + background: url(../images/previous-arrow.png) no-repeat left center; +} + +a.navLinkNext { + padding-right: 12px; + background: url(../images/next-arrow.png) no-repeat right center; +} + +a#showHideButton { + padding-left: 20px; + background: url(../images/sidebar.png) no-repeat left center; +} + + +.filetree li span a { color: #777; } + +#treediv { -webkit-box-shadow: #CCC 0px 1px 2px 0px inset; } + +.legal, .legal *{ + color: #555; + text-align: center; + padding-bottom: 10px; +} + +.internal { color : #0000CC;} + +.writeronly {color : red;} + +.remark, .remark .added, .remark .changed, .remark .deleted{ background: yellow;} + +tr th, tr th .internal, tr th .added, tr th .changed { + background: #00589E; + color: white; + font-weight: bold; + text-align: left; +} + +.statustext{ + position:fixed; + top:105px; + width: 0%; + height: 0%; + opacity: .3; + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -o-transform: rotate(90deg); + white-space: nowrap; + color: red; + font-weight: bold; + font-size: 2em; + margin-top: 30px; +} + +#toolbar { + width: 100%; + height: 33px; + position: fixed; + top: 93px; + z-index: 99; + left: 280px; + color: #333; + line-height: 28px; + padding-left: 10px; +} + +#toolbar-left { + position: relative; + left: 0px; +} + +body p.breadcrumbs { + margin: 0px; + padding: 0px; + line-height: 28px; +} + +/*body #content { + position: static; + margin-top: 126px; + top: 0px; +}*/ + +body.sidebar #toolbar{left: 0px;} + +body.sidebar #toolbar-left{left: 0px;} + +div#toolbar-left img {vertical-align: text-top;} + +div.note *, div.caution *, div.important *, div.tip *, div.warning * { + background: inherit !important; + color: inherit !important; + border: inherit /*!important*/; +} + +#content table thead, #content table th, #content table th p{ + color: white; + font-weight: bold; +} + +#content table caption{font-weight: bold;} + +#content table td, #content table {border: 1px solid black;} + +#content table td, #content table th { padding: 5px;} + +#content table {margin-bottom: 20px;} + +*[align = 'center']{ text-align: center;} + +#content .qandaset>table, #content .qandaset>table td, #content .calloutlist table, #content .calloutlist table td, #content .navfooter table, #content .navfooter table td { + border: 0px solid; +} + +#sidebar +{ + position: fixed; + margin: 0px; + left: 0px; + right: auto; + top: 99px; + bottom: 0px; + height: 543px; + z-index: 0; + display: block; + visibility: visible; + width: 280px; +} + +@media print { + + body * { + visibility: hidden; + } + + #content, #content * { + visibility: visible; + } + + #sidebar, .navfooter { + display: none; + } + + #content { + margin: 0 0 0 0; + } + +} + +#expanders { + float: left; + width: 100%; + padding-bottom: 1em; +} + +#expanders dt { + padding-bottom: 4px; + border-bottom: 2px solid #cccccc; + margin-top: 1em; + margin-bottom: 1em; + background: url(../images/plus.png) 0px 7px no-repeat; + /*background: pink;*/ + cursor: pointer; +} + +#expanders dt h2 { + font: bold 14pt IntervalLight, sans-serif; + text-decoration: none; + color: #0066CB; + /*background-position: -16px 0;*/ + padding-left: 13px; +} + +#expanders dt.plus { + background: url(../images/plus.png) 0px 7px no-repeat; +} + +#expanders dt.minus { + background: url(../images/minus.png) 0px 7px no-repeat; +} + + +#expanders dd { + display: none; + margin-bottom: 3em; + /*background: yellow;*/ +} + +#expanders .hitarea { + background: url(../images/ui-icons_217bc0_256x240.png) 0 -208px no-repeat; + height: 16px; + width: 16px; + float: left; + cursor: pointer; +} +/* fix for IE6 */ +/** html .hitarea { + display: inline; + float:none; +}*/ + + + +#expanders .prod +{ + width: 300px; + border: #DDD solid 1px; + float: left; + margin: 1px; + height: 160px; + margin-top: 0px; +} + +#expanders .prodimg +{ + /*border: #DDD solid 1px;*/ + float: left; +} + +.prodimg img { + display: block; + margin-left: 3px; + margin-top: auto; + margin-bottom: auto; + width: 100px; + vertical-align: middle; +} + +#expanders .prodtext +{ + /*background: #F8F8F8;*/ + width: 165px; + float: left; + margin-left: 1em; +} + +#expanders .prod p { + clear: both; +} + +#expanders ul { + margin: 0; + padding: 0; + list-style-type: none; +} + +#expanders li { + padding-left: 0.5em; +} + +a.external { + background: url("../images/external_link.gif") no-repeat scroll right top transparent; + padding: 0 13px 0 0; +} \ No newline at end of file diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/css/print.css b/xs/src/avrdude/atmel-docs/EDBG/common/css/print.css new file mode 100644 index 000000000..a52a074e7 --- /dev/null +++ b/xs/src/avrdude/atmel-docs/EDBG/common/css/print.css @@ -0,0 +1,28 @@ +body { + color : #000000 !important; + background : #ffffff !important; + font-family : "Times New Roman", Times, serif !important; + font-size : 12pt !important; +} + +#sidebar, #sidebar-resizer, #header-resizer, #header { display: none !important;} + +#content { + position: absolute !important; + margin: 0px !important; + left: 0px !important; + right: auto !important; + top: 0px !important; + height: auto !important; + overflow: visible !important; + overflow-x: visible !important; + border-left: 0px solid #000000 !important; +} + +.ui-layout-container { + overflow: visible !important; +} + +.mediaobject { + text-align: left !important; +} \ No newline at end of file diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/css/reset.css b/xs/src/avrdude/atmel-docs/EDBG/common/css/reset.css new file mode 100644 index 000000000..27802c681 --- /dev/null +++ b/xs/src/avrdude/atmel-docs/EDBG/common/css/reset.css @@ -0,0 +1 @@ +a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,dialog,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,html,i,iframe,img,ins,kbd,label,legend,li,main,mark,menu,meter,nav,object,ol,output,p,pre,progress,q,rp,rt,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video,xmp{border:0;margin:0;padding:0;font-size:100%}html,body{height:100%}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section{display:block}b,strong{font-weight:bold}img{color:transparent;font-size:0;vertical-align:middle;-ms-interpolation-mode:bicubic}ol,ul{list-style:none}li{display:list-item}table{border-collapse:collapse;border-spacing:0}th,td,caption{font-weight:normal;vertical-align:top;text-align:left}q{quotes:none}q:before,q:after{content:'';content:none}sub,sup,small{font-size:75%}sub,sup{line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}svg{overflow:hidden} \ No newline at end of file diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/css/text.css b/xs/src/avrdude/atmel-docs/EDBG/common/css/text.css new file mode 100644 index 000000000..0ef67296a --- /dev/null +++ b/xs/src/avrdude/atmel-docs/EDBG/common/css/text.css @@ -0,0 +1 @@ +body{font:13px/1.5 'Helvetica Neue',Arial,'Liberation Sans',FreeSans,sans-serif}pre,code{font-family:'DejaVu Sans Mono',Menlo,Consolas,monospace}hr{border:0 solid #ccc;border-top-width:1px;clear:both;height:0}h1{font-size:25px}h2{font-size:23px}h3{font-size:21px}h4{font-size:19px}h5{font-size:17px}h6{font-size:15px}ol{list-style:decimal}ul{list-style:disc}li{margin-left:30px}p,dl,hr,h1,h2,h3,h4,h5,h6,ol,ul,pre,table,address,fieldset,figure{margin-bottom:20px} \ No newline at end of file diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/fonts/DroidSansMono.eot b/xs/src/avrdude/atmel-docs/EDBG/common/fonts/DroidSansMono.eot new file mode 100644 index 0000000000000000000000000000000000000000..e4e3d1701a36b25a815be79529bfb5ee4250b1ea GIT binary patch literal 78514 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 WS5Eb4DOm!9bZ#mjixJS3Q2rAvu!(~J literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/fonts/DroidSansMono.ttf b/xs/src/avrdude/atmel-docs/EDBG/common/fonts/DroidSansMono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4546611d4d55347c95827d96d41a771d7ba283ca GIT binary patch literal 78296 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 z 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 P5YoA+fGkEpS3>zuTV!jd literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/images/Book_Closed.png b/xs/src/avrdude/atmel-docs/EDBG/common/images/Book_Closed.png new file mode 100644 index 0000000000000000000000000000000000000000..294fbf6b00fb1ca9ca39c1e0f673cc23858626d0 GIT binary patch literal 3245 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 literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/images/Book_Open.png b/xs/src/avrdude/atmel-docs/EDBG/common/images/Book_Open.png new file mode 100644 index 0000000000000000000000000000000000000000..d78710e775a660b146223648ded256d48142f903 GIT binary patch literal 703 zcmV;w0zmzVP)|lZCyn_&>~6#H!XA- zCA80NMq3vV1eqp5l#R^~qwn3{&Ks3HaJbxi&i9?~eDAUQPv_D2Tf^ws2!t=-oI@H@ zH>#cU@$7<;-{ z7YfAzB#DfLHX6zpN(*TSKvo6hMj{E=oY5Hx|#6p)6c zNhAhBN(n^_nphPTB>_6}D1Ewfq>HCPb-fF)w4kL2nKtYJlm)X1>a{;GDyC)&vm;3( zZBIi}qb4bhw#4S|pYXTqs7&S&MG@ld*3JZ_Bpj!qo`)pfLfovOM>lZ(Scntj!zd0N z$HYhp%b!=trI;pYoz=9QZ2v;ZG;r={56+fPqC7f?d>F!tOvhGEzeo}%G{L&XP}MJ1 z$9mD%dk90Lr#jl#TO7Q#MW3Nf+tu*x$0j*tLSY=c;+ks(IGU5OL002ovPDHLkV1n{gH-7*C literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/images/Document_Text.png b/xs/src/avrdude/atmel-docs/EDBG/common/images/Document_Text.png new file mode 100644 index 0000000000000000000000000000000000000000..416b5380d92c45bbace2d99223ff5e1ead4f5ef6 GIT binary patch literal 583 zcmV-N0=WH&P)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00009 za7bBm000XT000XT0n*)m`~Uy|8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L z^m3s900EatL_t(2Q;m_!O9D|C#pmy-g>7nE+uHOO1V!Pps8zJBoluJ?D58ZGC4qrK zp@pSk?}w(MWhrW@P5B-jr+J+2y)cSp(ZI(r-1D1r&iy!>JB(Iibp~Lu-(h|Cf{qCQ zM~9>0-yV$|tZW~nvv(L%Ci4~pc8-EA^%_yjiiU-CI~<;X4q3SE1K$rorD9n_O;Ry$ z-bYv8NPW1?y=w+cEb|zg<v;eG literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/images/Library.png b/xs/src/avrdude/atmel-docs/EDBG/common/images/Library.png new file mode 100644 index 0000000000000000000000000000000000000000..a2fa8fce4b7f87a2ea24137a551206e0107f9834 GIT binary patch literal 798 zcmV+(1L6FMP)ng|9zOSdc~?lpc^8kTC}#*Hk+Uu0tp#GM*9ibM^8 z5HzAlVF8vPQb$|+qotjBGjHCT=bb^to7~*V&AsQGckVzb1ut(8PN~b+@2OO_tnLp? ztNte=>g>QHl`gESWWJ!z-x*Tg+^zn8RnDcAo-3;>4~CTHH6IQysL$~?s_)z>ZDKTq zVq+e&UlZ!u=^m{u+=vTzhjFwyjODQzb*ZmcYifz$>fkWSE})IPG!!V-ix%F0NZ?S9 ziK4-fFB^U}ZI154U0}?Bxt51%mcT8BccBB=SBxPbr9vpQ74;1v1cN_4EOfU;{OY<2 zWAk79@78cT5T>5e@H+7w$e3`1jeuJhHzZ9sQj#?3FMHMRI~=w~%VZkoYIENCqreM?yO7cacLZ!o4@k%j0EY%m zhro$|yPE)FLxF%4F1?K^8R{)F&S}~8LHt3%VMzD@w)zi13QvK9$*Cza(MC3t!VXb` z*oux4vtZB(&0+za9UaK8%z)W+R>uM})_oHt5d=(AptG|Jr4mP}yaXAr z%%StL4Fz5VIF~XSJz43H#mt%|6W38+Ta7J&08q0H!Kx+*#$eU8z^W3UE21XoA~*gR zFK*t@XbP3__$oc&7yU?|Q0MN&YC4BPHjQjz1<9oa^q#qhYJC!NEr)DMN1XbT&z@?Y cg5LrR0IL|>8gzzU)&Kwi07*qoM6N<$f-+THGynhq literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/images/external_link.gif b/xs/src/avrdude/atmel-docs/EDBG/common/images/external_link.gif new file mode 100644 index 0000000000000000000000000000000000000000..177cbbc72b923fed4ea521b1d7ddff9bf86d6260 GIT binary patch literal 98 zcmZ?wbhEHbC;V{HvICMz`~#d5&)@XU{?3ob?2Va pDUN9p7X7Q<2{`PClr$}iU}#V;Y&>|qO77UssIvB&{}!AK)&PlRB2WMT literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/images/loading.gif b/xs/src/avrdude/atmel-docs/EDBG/common/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..085ccaecaf5fa5c34bc14cd2c2ed5cbbd8e25dcb GIT binary patch literal 1553 zcma)+TTl~c6vwlh>nb99Af5rT)t{mCEg5urg=A(g z{C|6SPb~9Xage|wB`SrZk2FOMYM!buln2sX?5Y+T78iB(Zu9cS7|LZyZ++}u$^oi1 z_j@S}bW9OzU2R+RMy&~OT>X-oZ98$jq#ogNfJ!BM-42wHGZk*6s2KD}U*IA%epmxb zm}|6BK9YoIF;*xSL!+z@<64lB7->LTW2Vi4ostCA(z&2XniwNIv}fFo-`MbG;)u4G z^p@F!)|9HhZprHd_vXjDoxs6WkK-6P0@lfxnGT>*p(QHoUV=u1FAqb@b%*W=a3{`LsH5k^AvQNL>6fPpy#oU(&MuH(*aEX4b35*} zn4n7)`I2U%=+Z=?BVZQ?vjQFW4gD@~XSOO6b{qu81`4&LFuU2(ilxW+1|ZkNMnWe79C$gs zWT?Ele|HR{JGPe)5BTW>0Ey?-Ls6S#GoV0tbt6ku7B&*0 z;i9QM$W1Rj*rRIdceL)rAOSl+sDe3LkB87<%){;ZdHp6|SNlopDXRx< zxBDF9-lTo&v`8$humFygUij@qgT=Qzhj8{ym2-{Xciwqq_Xwk%=O3B-MNAL_6e`3U zyxwmXex4`g0^1RYw~Dth3av3Dl^AAlpO3mG!nLr#&ZZ7c_wUboI+deC+&%TFjK2Lm z!Y&f1h|T_On%RCV&=4bx`!>(YezqGVhl&QpED?N6GV)HmzJ9&rh$x*i?*@o9#6QI< z5ZI_MRX;0+pY8$`j)eF#TlUyG(eE%E7S!rj;mj^M5vhUicPm zVWQ2z+imFyg}SRABmOBY_@osR!>7Ov!ioK`NB6_Rv}7Ud?35ed5Sb@?yND?kv~RCa wqs^a3Sh>&&L4)!LKI?D2&k@))k(LESaga|C278ChSzn3NWVkcuNoY&{0f?~U_5c6? literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/images/logo.png b/xs/src/avrdude/atmel-docs/EDBG/common/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..df85ffbeb29836ae38402ba7e1b474fa1f342464 GIT binary patch literal 4305 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 literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/images/next-arrow.png b/xs/src/avrdude/atmel-docs/EDBG/common/images/next-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..db595f465da4d03955dfcb11980a279b6ab6ccad GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dF8<0HkD{mW+k}PqJC<)F_D=AMbN@Z|N$xljE z@XSq2PYp^7*cU7>Bs;7_RJjWDk>HR4;U0G)l~k~EqL_RVNHXt zp|F%aL&tk&QFDfk40f#s0sKdvH+BhgXtFR)5Pp>CcW~(kW&w4*hz$n>JLDT!A~tAb uu{`2*V3nW1I#D!_;gQn}&KC>{2N>!FRd(cyzWN5Vl)=;0&t;ucLK6V+=s$P> literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/images/plus.png b/xs/src/avrdude/atmel-docs/EDBG/common/images/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..31010fe96a0e0c29826094f47cd8bcac0457246f GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=qdAc};RNP9+$;kL|-ho3Ph-Fgx zA*H^Bot=#w2bvDENX!(7*cU7>Bs;7_RM+{CQNw1Fo``;OomIOA;eyQoxxDq zqleYEkzs-s!=tK_vpODKLJPP=Hrzbak`ij8=UULpEv8e!aHP*6O-Z2sz)AtOhAwdi tO;?4yBLSV-6%OYZAAQ~MfRV$1!EulJ!>J6GyMcBxc)I$ztaD0e0sv`WKHvZV literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/images/search-icon.png b/xs/src/avrdude/atmel-docs/EDBG/common/images/search-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..715f62d08b07f857b5866aadab38c9275c1c7513 GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6L!3HE_wj8emQjEnx?oJHr&dIz4a@dl*-CY>| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sf9Y#@6Www1Qyw!k0S3F%DLp+YZ zy<+I?6ez>`Aztf}Sn4}APCv){3l|=>Yl)V3lbRE=XyLww>=g=mre-ad1o$;s=E~eD z+1Y%=dExh#rt)dr&+9GQtIt35Z{zvT^t|GLxm`j3W0RKkh6mMWWjy3Aj!_ZROK!09 ztNWn5M@?|QQ%lvEHI1z2$~vEH`%o!!e`u6{1-oD!M<4CsTk literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/images/sidebar.png b/xs/src/avrdude/atmel-docs/EDBG/common/images/sidebar.png new file mode 100644 index 0000000000000000000000000000000000000000..5492671871c1fdb7c149bf233e34ebddd074c777 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp@K+MU(1SHcW3~hmwWQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8U{4pvkcwMLbBxo^O;mQ5C}5VBp8e!WN?S`y%iQnt-qwGU z>u7lMf5n5>*VhX;sx9C%(%2aC{q^zkm`nHf)ixVQbn@6YFfcQ; Xxf$LLJ^5Y}Xgq_btDnm{r-UW|fBilp literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/images/starsSmall.png b/xs/src/avrdude/atmel-docs/EDBG/common/images/starsSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..490a27b9255075c8ce355aa3e36f89c82038b794 GIT binary patch literal 1032 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 literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/jquery-1.7.2.min.js b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/jquery-1.7.2.min.js new file mode 100644 index 000000000..93adea19f --- /dev/null +++ b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/jquery-1.7.2.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.2 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="

"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/jquery.cookie.js b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/jquery.cookie.js new file mode 100644 index 000000000..bada7bff7 --- /dev/null +++ b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/jquery.cookie.js @@ -0,0 +1,93 @@ +/** + * Cookie plugin + * + * Copyright (c) 2006 Klaus Hartl (stilbuero.de) + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + */ + +/** + * Create a cookie with the given name and value and other optional parameters. + * + * @example $.cookie('the_cookie', 'the_value'); + * @desc Set the value of a cookie. + * @example $.cookie('the_cookie', 'the_value', {expires: 7, path: '/', domain: 'jquery.com', secure: true}); + * @desc Create a cookie with all available options. + * @example $.cookie('the_cookie', 'the_value'); + * @desc Create a session cookie. + * @example $.cookie('the_cookie', null); + * @desc Delete a cookie by passing null as value. + * + * @param String name The name of the cookie. + * @param String value The value of the cookie. + * @param Object options An object literal containing key/value pairs to provide optional cookie attributes. + * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object. + * If a negative value is specified (e.g. a date in the past), the cookie will be deleted. + * If set to null or omitted, the cookie will be a session cookie and will not be retained + * when the the browser exits. + * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie). + * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie). + * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will + * require a secure protocol (like HTTPS). + * @type undefined + * + * @name $.cookie + * @cat Plugins/Cookie + * @author Klaus Hartl/klaus.hartl@stilbuero.de + */ + +/** + * Get the value of a cookie with the given name. + * + * @example $.cookie('the_cookie'); + * @desc Get the value of a cookie. + * + * @param String name The name of the cookie. + * @return The value of the cookie. + * @type String + * + * @name $.cookie + * @cat Plugins/Cookie + * @author Klaus Hartl/klaus.hartl@stilbuero.de + */ +jQuery.cookie = function(name, value, options) { + if (typeof value != 'undefined') { // name and value given, set cookie + options = options || {}; + if (value === null) { + value = ''; + options.expires = -1; + } + var expires = ''; + if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { + var date; + if (typeof options.expires == 'number') { + date = new Date(); + date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); + } else { + date = options.expires; + } + expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE + } + var path = options.path ? '; path=' + options.path : ''; + var domain = options.domain ? '; domain=' + options.domain : ''; + var secure = options.secure ? '; secure' : ''; + document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); + + } else { // only name given, get cookie + var cookieValue = null; + if (document.cookie && document.cookie != '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) == (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } +}; \ No newline at end of file diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/jquery.ui.all.js b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/jquery.ui.all.js new file mode 100644 index 000000000..943d3b357 --- /dev/null +++ b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/jquery.ui.all.js @@ -0,0 +1,418 @@ +/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(b,a){function c(c,a){var e=c.nodeName.toLowerCase();if("area"===e){var e=c.parentNode,f=e.name;if(!c.href||!f||"map"!==e.nodeName.toLowerCase())return!1;e=b("img[usemap=#"+f+"]")[0];return!!e&&d(e)}return(/input|select|textarea|button|object/.test(e)?!c.disabled:"a"==e?c.href||a:a)&&d(c)}function d(c){return!b(c).parents().andSelf().filter(function(){return"hidden"===b.curCSS(this,"visibility")||b.expr.filters.hidden(this)}).length}b.ui=b.ui||{};b.ui.version||(b.extend(b.ui,{version:"1.8.14", +keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),b.fn.extend({_focus:b.fn.focus,focus:function(c,a){return"number"===typeof c?this.each(function(){var d=this;setTimeout(function(){b(d).focus(); +a&&a.call(d)},c)}):this._focus.apply(this,arguments)},scrollParent:function(){var c;c=b.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(b.curCSS(this,"position",1))&&/(auto|scroll)/.test(b.curCSS(this,"overflow",1)+b.curCSS(this,"overflow-y",1)+b.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(b.curCSS(this,"overflow",1)+b.curCSS(this, +"overflow-y",1)+b.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!c.length?b(document):c},zIndex:function(c){if(c!==a)return this.css("zIndex",c);if(this.length)for(var c=b(this[0]),d;c.length&&c[0]!==document;){d=c.css("position");if("absolute"===d||"relative"===d||"fixed"===d)if(d=parseInt(c.css("zIndex"),10),!isNaN(d)&&0!==d)return d;c=c.parent()}return 0},disableSelection:function(){return this.bind((b.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection", +function(b){b.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),b.each(["Width","Height"],function(c,d){function e(c,a,d,g){b.each(f,function(){a-=parseFloat(b.curCSS(c,"padding"+this,!0))||0;d&&(a-=parseFloat(b.curCSS(c,"border"+this+"Width",!0))||0);g&&(a-=parseFloat(b.curCSS(c,"margin"+this,!0))||0)});return a}var f="Width"===d?["Left","Right"]:["Top","Bottom"],i=d.toLowerCase(),j={innerWidth:b.fn.innerWidth,innerHeight:b.fn.innerHeight,outerWidth:b.fn.outerWidth, +outerHeight:b.fn.outerHeight};b.fn["inner"+d]=function(f){return f===a?j["inner"+d].call(this):this.each(function(){b(this).css(i,e(this,f)+"px")})};b.fn["outer"+d]=function(f,c){return"number"!==typeof f?j["outer"+d].call(this,f):this.each(function(){b(this).css(i,e(this,f,!0,c)+"px")})}}),b.extend(b.expr[":"],{data:function(c,a,d){return!!b.data(c,d[3])},focusable:function(a){return c(a,!isNaN(b.attr(a,"tabindex")))},tabbable:function(a){var d=b.attr(a,"tabindex"),e=isNaN(d);return(e||0<=d)&&c(a, +!e)}}),b(function(){var c=document.body,a=c.appendChild(a=document.createElement("div"));b.extend(a.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});b.support.minHeight=100===a.offsetHeight;b.support.selectstart="onselectstart"in a;c.removeChild(a).style.display="none"}),b.extend(b.ui,{plugin:{add:function(c,a,d){var c=b.ui[c].prototype,f;for(f in d)c.plugins[f]=c.plugins[f]||[],c.plugins[f].push([a,d[f]])},call:function(b,c,a){if((c=b.plugins[c])&&b.element[0].parentNode)for(var f= +0;fc&&b=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})})(jQuery); +(function(b){b.ui=b.ui||{};var a=/left|center|right/,c=/top|center|bottom/,d=b.fn.position,g=b.fn.offset;b.fn.position=function(g){if(!g||!g.of)return d.apply(this,arguments);var g=b.extend({},g),e=b(g.of),f=e[0],i=(g.collision||"flip").split(" "),j=g.offset?g.offset.split(" "):[0,0],k,l,m;9===f.nodeType?(k=e.width(),l=e.height(),m={top:0,left:0}):f.setTimeout?(k=e.width(),l=e.height(),m={top:e.scrollTop(),left:e.scrollLeft()}):f.preventDefault?(g.at="left top",k=l=0,m={top:g.of.pageY,left:g.of.pageX}): +(k=e.outerWidth(),l=e.outerHeight(),m=e.offset());b.each(["my","at"],function(){var b=(g[this]||"").split(" ");b.length===1&&(b=a.test(b[0])?b.concat(["center"]):c.test(b[0])?["center"].concat(b):["center","center"]);b[0]=a.test(b[0])?b[0]:"center";b[1]=c.test(b[1])?b[1]:"center";g[this]=b});1===i.length&&(i[1]=i[0]);j[0]=parseInt(j[0],10)||0;1===j.length&&(j[1]=j[0]);j[1]=parseInt(j[1],10)||0;"right"===g.at[0]?m.left+=k:"center"===g.at[0]&&(m.left+=k/2);"bottom"===g.at[1]?m.top+=l:"center"===g.at[1]&& +(m.top+=l/2);m.left+=j[0];m.top+=j[1];return this.each(function(){var f=b(this),c=f.outerWidth(),a=f.outerHeight(),d=parseInt(b.curCSS(this,"marginLeft",true))||0,e=parseInt(b.curCSS(this,"marginTop",true))||0,r=c+d+(parseInt(b.curCSS(this,"marginRight",true))||0),u=a+e+(parseInt(b.curCSS(this,"marginBottom",true))||0),s=b.extend({},m),v;if(g.my[0]==="right")s.left=s.left-c;else if(g.my[0]==="center")s.left=s.left-c/2;if(g.my[1]==="bottom")s.top=s.top-a;else if(g.my[1]==="center")s.top=s.top-a/2; +s.left=Math.round(s.left);s.top=Math.round(s.top);v={left:s.left-d,top:s.top-e};b.each(["left","top"],function(f,d){if(b.ui.position[i[f]])b.ui.position[i[f]][d](s,{targetWidth:k,targetHeight:l,elemWidth:c,elemHeight:a,collisionPosition:v,collisionWidth:r,collisionHeight:u,offset:j,my:g.my,at:g.at})});b.fn.bgiframe&&f.bgiframe();f.offset(b.extend(s,{using:g.using}))})};b.ui.position={fit:{left:function(c,a){var f=b(window),f=a.collisionPosition.left+a.collisionWidth-f.width()-f.scrollLeft();c.left= +0a.collisionPosition.left?d+g+k:0a.collisionPosition.top?d+g+k:0
').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(b(this).offset()).appendTo("body")});return!0},_mouseStart:function(a){var c=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();b.ui.ddmanager&&(b.ui.ddmanager.current=this); +this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};b.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY= +a.pageY;c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt);c.containment&&this._setContainment();if(!1===this._trigger("start",a))return this._clear(),!1;this._cacheHelperProportions();b.ui.ddmanager&&!c.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,!0);b.ui.ddmanager&&b.ui.ddmanager.dragStart(this,a);return!0},_mouseDrag:function(a,c){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute"); +if(!c){var d=this._uiHash();if(!1===this._trigger("drag",a,d))return this._mouseUp({}),!1;this.position=d.position}if(!this.options.axis||"y"!=this.options.axis)this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||"x"!=this.options.axis)this.helper[0].style.top=this.position.top+"px";b.ui.ddmanager&&b.ui.ddmanager.drag(this,a);return!1},_mouseStop:function(a){var c=!1;b.ui.ddmanager&&!this.options.dropBehaviour&&(c=b.ui.ddmanager.drop(this,a));this.dropped&&(c=this.dropped,this.dropped= +!1);if((!this.element[0]||!this.element[0].parentNode)&&"original"==this.options.helper)return!1;if("invalid"==this.options.revert&&!c||"valid"==this.options.revert&&c||!0===this.options.revert||b.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var d=this;b(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){d._trigger("stop",a)!==false&&d._clear()})}else!1!==this._trigger("stop",a)&&this._clear();return!1},_mouseUp:function(a){!0=== +this.options.iframeFix&&b("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});b.ui.ddmanager&&b.ui.ddmanager.dragStop(this,a);return b.ui.mouse.prototype._mouseUp.call(this,a)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var c=!this.options.handle||!b(this.options.handle,this.element).length?!0:!1;b(this.options.handle,this.element).find("*").andSelf().each(function(){this==a.target&&(c= +!0)});return c},_createHelper:function(a){var c=this.options,a=b.isFunction(c.helper)?b(c.helper.apply(this.element[0],[a])):"clone"==c.helper?this.element.clone().removeAttr("id"):this.element;a.parents("body").length||a.appendTo("parent"==c.appendTo?this.element[0].parentNode:c.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){"string"==typeof a&&(a=a.split(" "));b.isArray(a)&&(a={left:+a[0],top:+a[1]|| +0});"left"in a&&(this.offset.click.left=a.left+this.margins.left);"right"in a&&(this.offset.click.left=this.helperProportions.width-a.right+this.margins.left);"top"in a&&(this.offset.click.top=a.top+this.margins.top);"bottom"in a&&(this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();"absolute"==this.cssPosition&&(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0], +this.offsetParent[0]))&&(a.left+=this.scrollParent.scrollLeft(),a.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&"html"==this.offsetParent[0].tagName.toLowerCase()&&b.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"==this.cssPosition){var b=this.element.position();return{top:b.top- +(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(), +height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;"parent"==a.containment&&(a.containment=this.helper[0].parentNode);if("document"==a.containment||"window"==a.containment)this.containment=["document"==a.containment?0:b(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,"document"==a.containment?0:b(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,("document"==a.containment?0:b(window).scrollLeft())+b("document"==a.containment?document: +window).width()-this.helperProportions.width-this.margins.left,("document"==a.containment?0:b(window).scrollTop())+(b("document"==a.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){var a=b(a.containment),c=a[0];if(c){a.offset();var d="hidden"!=b(c).css("overflow");this.containment=[(parseInt(b(c).css("borderLeftWidth"),10)||0)+(parseInt(b(c).css("paddingLeft"), +10)||0),(parseInt(b(c).css("borderTopWidth"),10)||0)+(parseInt(b(c).css("paddingTop"),10)||0),(d?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(b(c).css("borderLeftWidth"),10)||0)-(parseInt(b(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(d?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(b(c).css("borderTopWidth"),10)||0)-(parseInt(b(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom]; +this.relative_container=a}}else a.containment.constructor==Array&&(this.containment=a.containment)},_convertPositionTo:function(a,c){c||(c=this.position);var d="absolute"==a?1:-1,g="absolute"==this.cssPosition&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,h=/(html|body)/i.test(g[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(b.browser.safari&&526>b.browser.version&&"fixed"==this.cssPosition? +0:("fixed"==this.cssPosition?-this.scrollParent.scrollTop():h?0:g.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(b.browser.safari&&526>b.browser.version&&"fixed"==this.cssPosition?0:("fixed"==this.cssPosition?-this.scrollParent.scrollLeft():h?0:g.scrollLeft())*d)}},_generatePosition:function(a){var c=this.options,d="absolute"==this.cssPosition&&!(this.scrollParent[0]!=document&&b.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent, +g=/(html|body)/i.test(d[0].tagName),h=a.pageX,e=a.pageY;if(this.originalPosition){var f;this.containment&&(this.relative_container?(f=this.relative_container.offset(),f=[this.containment[0]+f.left,this.containment[1]+f.top,this.containment[2]+f.left,this.containment[3]+f.top]):f=this.containment,a.pageX-this.offset.click.leftf[2]&&(h=f[2]+this.offset.click.left), +a.pageY-this.offset.click.top>f[3]&&(e=f[3]+this.offset.click.top));c.grid&&(e=c.grid[1]?this.originalPageY+Math.round((e-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY,e=f?!(e-this.offset.click.topf[3])?e:!(e-this.offset.click.topf[2])?h:!(h-this.offset.click.left< +f[0])?h-c.grid[0]:h+c.grid[0]:h)}return{top:e-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(b.browser.safari&&526>b.browser.version&&"fixed"==this.cssPosition?0:"fixed"==this.cssPosition?-this.scrollParent.scrollTop():g?0:d.scrollTop()),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(b.browser.safari&&526>b.browser.version&&"fixed"==this.cssPosition?0:"fixed"==this.cssPosition?-this.scrollParent.scrollLeft():g?0:d.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"); +this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=!1},_trigger:function(a,c,d){d=d||this._uiHash();b.ui.plugin.call(this,a,[c,d]);"drag"==a&&(this.positionAbs=this._convertPositionTo("absolute"));return b.Widget.prototype._trigger.call(this,a,c,d)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});b.extend(b.ui.draggable,{version:"1.8.14"}); +b.ui.plugin.add("draggable","connectToSortable",{start:function(a,c){var d=b(this).data("draggable"),g=d.options,h=b.extend({},c,{item:d.element});d.sortables=[];b(g.connectToSortable).each(function(){var c=b.data(this,"sortable");c&&!c.options.disabled&&(d.sortables.push({instance:c,shouldRevert:c.options.revert}),c.refreshPositions(),c._trigger("activate",a,h))})},stop:function(a,c){var d=b(this).data("draggable"),g=b.extend({},c,{item:d.element});b.each(d.sortables,function(){this.instance.isOver? +(this.instance.isOver=0,d.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=!0),this.instance._mouseStop(a),this.instance.options.helper=this.instance.options._helper,"original"==d.options.helper&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",a,g))})},drag:function(a,c){var d=b(this).data("draggable"),g=this;b.each(d.sortables,function(){this.instance.positionAbs= +d.positionAbs;this.instance.helperProportions=d.helperProportions;this.instance.offset.click=d.offset.click;this.instance._intersectsWith(this.instance.containerCache)?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=b(g).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return c.helper[0]},a.target=this.instance.currentItem[0],this.instance._mouseCapture(a, +!0),this.instance._mouseStart(a,!0,!0),this.instance.offset.click.top=d.offset.click.top,this.instance.offset.click.left=d.offset.click.left,this.instance.offset.parent.left-=d.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=d.offset.parent.top-this.instance.offset.parent.top,d._trigger("toSortable",a),d.dropped=this.instance.element,d.currentItem=d.element,this.instance.fromOutside=d),this.instance.currentItem&&this.instance._mouseDrag(a)):this.instance.isOver&& +(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",a,this.instance._uiHash(this.instance)),this.instance._mouseStop(a,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),d._trigger("fromSortable",a),d.dropped=!1)})}});b.ui.plugin.add("draggable","cursor",{start:function(){var a=b("body"),c=b(this).data("draggable").options; +a.css("cursor")&&(c._cursor=a.css("cursor"));a.css("cursor",c.cursor)},stop:function(){var a=b(this).data("draggable").options;a._cursor&&b("body").css("cursor",a._cursor)}});b.ui.plugin.add("draggable","opacity",{start:function(a,c){var d=b(c.helper),g=b(this).data("draggable").options;d.css("opacity")&&(g._opacity=d.css("opacity"));d.css("opacity",g.opacity)},stop:function(a,c){var d=b(this).data("draggable").options;d._opacity&&b(c.helper).css("opacity",d._opacity)}});b.ui.plugin.add("draggable", +"scroll",{start:function(){var a=b(this).data("draggable");a.scrollParent[0]!=document&&"HTML"!=a.scrollParent[0].tagName&&(a.overflowOffset=a.scrollParent.offset())},drag:function(a){var c=b(this).data("draggable"),d=c.options,g=!1;if(c.scrollParent[0]!=document&&"HTML"!=c.scrollParent[0].tagName){if(!d.axis||"x"!=d.axis)c.overflowOffset.top+c.scrollParent[0].offsetHeight-a.pageY=k&&e<=l||f>=k&&f<=l||el)&&(g>=i&&g<=j||h>=i&&h<=j||gj);default:return!1}}; +b.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,c){var d=b.ui.ddmanager.droppables[a.options.scope]||[],g=c?c.type:null,h=(a.currentItem||a.element).find(":data(droppable)").andSelf(),e=0;a:for(;e').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})), +this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize", +"none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize());this.handles=a.handles||(!b(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){"all"== +this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw");var h=this.handles.split(",");this.handles={};for(var e=0;e');/sw|se|ne|nw/.test(f)&&i.css({zIndex:++a.zIndex});"se"==f&&i.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(i)}}this._renderAxis=function(f){var f=f||this.element,c;for(c in this.handles){this.handles[c].constructor==String&&(this.handles[c]= +b(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var a=b(this.handles[c],this.element),d=0,d=/sw|ne|nw|se|n|s/.test(c)?a.outerHeight():a.outerWidth(),a=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");f.css(a,d);this._proportionallyResize()}b(this.handles[c])}};this._renderAxis(this.element);this._handles=b(".ui-resizable-handle",this.element).disableSelection(); +this._handles.mouseover(function(){if(!c.resizing){if(this.className)var b=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);c.axis=b&&b[1]?b[1]:"se"}});a.autoHide&&(this._handles.hide(),b(this.element).addClass("ui-resizable-autohide").hover(function(){if(!a.disabled){b(this).removeClass("ui-resizable-autohide");c._handles.show()}},function(){if(!a.disabled&&!c.resizing){b(this).addClass("ui-resizable-autohide");c._handles.hide()}}));this._mouseInit()},destroy:function(){this._mouseDestroy(); +var c=function(c){b(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){c(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);c(this.originalElement);return this},_mouseCapture:function(c){var a= +!1,h;for(h in this.handles)b(this.handles[h])[0]==c.target&&(a=!0);return!this.options.disabled&&a},_mouseStart:function(c){var g=this.options,h=this.element.position(),e=this.element;this.resizing=!0;this.documentScroll={top:b(document).scrollTop(),left:b(document).scrollLeft()};(e.is(".ui-draggable")||/absolute/.test(e.css("position")))&&e.css({position:"absolute",top:h.top,left:h.left});b.browser.opera&&/relative/.test(e.css("position"))&&e.css({position:"relative",top:"auto",left:"auto"});this._renderProxy(); +var h=a(this.helper.css("left")),f=a(this.helper.css("top"));g.containment&&(h+=b(g.containment).scrollLeft()||0,f+=b(g.containment).scrollTop()||0);this.offset=this.helper.offset();this.position={left:h,top:f};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:h,top:f};this.sizeDiff={width:e.outerWidth()- +e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:c.pageX,top:c.pageY};this.aspectRatio="number"==typeof g.aspectRatio?g.aspectRatio:this.originalSize.width/this.originalSize.height||1;g=b(".ui-resizable-"+this.axis).css("cursor");b("body").css("cursor","auto"==g?this.axis+"-resize":g);e.addClass("ui-resizable-resizing");this._propagate("start",c);return!0},_mouseDrag:function(b){var c=this.helper,a=this.originalMousePosition,e=this._change[this.axis];if(!e)return!1;a= +e.apply(this,[b,b.pageX-a.left||0,b.pageY-a.top||0]);this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)a=this._updateRatio(a,b);a=this._respectSize(a,b);this._propagate("resize",b);c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(a);this._trigger("resize",b,this.ui());return!1},_mouseStop:function(c){this.resizing= +!1;var a=this.options;if(this._helper){var h=this._proportionallyResizeElements,e=h.length&&/textarea/i.test(h[0].nodeName),h=e&&b.ui.hasScroll(h[0],"left")?0:this.sizeDiff.height,e=e?0:this.sizeDiff.width,e={width:this.helper.width()-e,height:this.helper.height()-h},h=parseInt(this.element.css("left"),10)+(this.position.left-this.originalPosition.left)||null,f=parseInt(this.element.css("top"),10)+(this.position.top-this.originalPosition.top)||null;a.animate||this.element.css(b.extend(e,{top:f,left:h})); +this.helper.height(this.size.height);this.helper.width(this.size.width);this._helper&&!a.animate&&this._proportionallyResize()}b("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",c);this._helper&&this.helper.remove();return!1},_updateVirtualBoundaries:function(b){var a=this.options,h,e,f,a={minWidth:c(a.minWidth)?a.minWidth:0,maxWidth:c(a.maxWidth)?a.maxWidth:Infinity,minHeight:c(a.minHeight)?a.minHeight:0,maxHeight:c(a.maxHeight)?a.maxHeight:Infinity}; +if(this._aspectRatio||b)if(b=a.minHeight*this.aspectRatio,e=a.minWidth/this.aspectRatio,h=a.maxHeight*this.aspectRatio,f=a.maxWidth/this.aspectRatio,b>a.minWidth&&(a.minWidth=b),e>a.minHeight&&(a.minHeight=e),hb.width,j=c(b.height)&&a.minHeight&&a.minHeight> +b.height;i&&(b.width=a.minWidth);j&&(b.height=a.minHeight);e&&(b.width=a.maxWidth);f&&(b.height=a.maxHeight);var k=this.originalPosition.left+this.originalSize.width,l=this.position.top+this.size.height,m=/sw|nw|w/.test(h),h=/nw|ne|n/.test(h);i&&m&&(b.left=k-a.minWidth);e&&m&&(b.left=k-a.maxWidth);j&&h&&(b.top=l-a.minHeight);f&&h&&(b.top=l-a.maxHeight);(a=!b.width&&!b.height)&&!b.left&&b.top?b.top=null:a&&(!b.top&&b.left)&&(b.left=null);return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var c= +this.helper||this.element,a=0;a');var a=b.browser.msie&&7>b.browser.version,h=a?1:0,a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-h+"px",top:this.elementOffset.top- +h+"px",zIndex:++c.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,c){return{width:this.originalSize.width+c}},w:function(b,c){return{left:this.originalPosition.left+c,width:this.originalSize.width-c}},n:function(b,c,a){return{top:this.originalPosition.top+a,height:this.originalSize.height-a}},s:function(b,c,a){return{height:this.originalSize.height+a}},se:function(c,a,h){return b.extend(this._change.s.apply(this,arguments),this._change.e.apply(this, +[c,a,h]))},sw:function(c,a,h){return b.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[c,a,h]))},ne:function(c,a,h){return b.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[c,a,h]))},nw:function(c,a,h){return b.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[c,a,h]))}},_propagate:function(c,a){b.ui.plugin.call(this,c,[a,this.ui()]);"resize"!=c&&this._trigger(c,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement, +element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});b.extend(b.ui.resizable,{version:"1.8.14"});b.ui.plugin.add("resizable","alsoResize",{start:function(){var c=b(this).data("resizable").options,a=function(c){b(c).each(function(){var c=b(this);c.data("resizable-alsoresize",{width:parseInt(c.width(),10),height:parseInt(c.height(),10),left:parseInt(c.css("left"),10),top:parseInt(c.css("top"),10),position:c.css("position")})})}; +"object"==typeof c.alsoResize&&!c.alsoResize.parentNode?c.alsoResize.length?(c.alsoResize=c.alsoResize[0],a(c.alsoResize)):b.each(c.alsoResize,function(b){a(b)}):a(c.alsoResize)},resize:function(c,a){var h=b(this).data("resizable"),e=h.options,f=h.originalSize,i=h.originalPosition,j={height:h.size.height-f.height||0,width:h.size.width-f.width||0,top:h.position.top-i.top||0,left:h.position.left-i.left||0},k=function(c,f){b(c).each(function(){var c=b(this),d=b(this).data("resizable-alsoresize"),i={}, +e=f&&f.length?f:c.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];b.each(e,function(b,c){var a=(d[c]||0)+(j[c]||0);a&&0<=a&&(i[c]=a||null)});b.browser.opera&&/relative/.test(c.css("position"))&&(h._revertToRelativePosition=!0,c.css({position:"absolute",top:"auto",left:"auto"}));c.css(i)})};"object"==typeof e.alsoResize&&!e.alsoResize.nodeType?b.each(e.alsoResize,function(b,c){k(b,c)}):k(e.alsoResize)},stop:function(){var c=b(this).data("resizable"),a=c.options, +h=function(c){b(c).each(function(){var c=b(this);c.css({position:c.data("resizable-alsoresize").position})})};c._revertToRelativePosition&&(c._revertToRelativePosition=!1,"object"==typeof a.alsoResize&&!a.alsoResize.nodeType?b.each(a.alsoResize,function(b){h(b)}):h(a.alsoResize));b(this).removeData("resizable-alsoresize")}});b.ui.plugin.add("resizable","animate",{stop:function(c){var a=b(this).data("resizable"),h=a.options,e=a._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName), +i=f&&b.ui.hasScroll(e[0],"left")?0:a.sizeDiff.height,f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-i},i=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null,j=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(b.extend(f,j&&i?{top:j,left:i}:{}),{duration:h.animateDuration,easing:h.animateEasing,step:function(){var f={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10), +top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};e&&e.length&&b(e[0]).css({width:f.width,height:f.height});a._updateCache(f);a._propagate("resize",c)}})}});b.ui.plugin.add("resizable","containment",{start:function(){var c=b(this).data("resizable"),g=c.element,h=c.options.containment;if(g=h instanceof b?h.get(0):/parent/.test(h)?g.parent().get(0):h)if(c.containerElement=b(g),/document/.test(h)||h==document)c.containerOffset={left:0,top:0},c.containerPosition={left:0,top:0}, +c.parentData={element:b(document),left:0,top:0,width:b(document).width(),height:b(document).height()||document.body.parentNode.scrollHeight};else{var e=b(g),f=[];b(["Top","Right","Left","Bottom"]).each(function(b,c){f[b]=a(e.css("padding"+c))});c.containerOffset=e.offset();c.containerPosition=e.position();c.containerSize={height:e.innerHeight()-f[3],width:e.innerWidth()-f[1]};var h=c.containerOffset,i=c.containerSize.height,j=c.containerSize.width,j=b.ui.hasScroll(g,"left")?g.scrollWidth:j,i=b.ui.hasScroll(g)? +g.scrollHeight:i;c.parentData={element:g,left:h.left,top:h.top,width:j,height:i}}},resize:function(c){var a=b(this).data("resizable"),h=a.options,e=a.containerOffset,f=a.position,c=a._aspectRatio||c.shiftKey,i={top:0,left:0},j=a.containerElement;j[0]!=document&&/static/.test(j.css("position"))&&(i=e);if(f.left<(a._helper?e.left:0))a.size.width+=a._helper?a.position.left-e.left:a.position.left-i.left,c&&(a.size.height=a.size.width/h.aspectRatio),a.position.left=h.helper?e.left:0;if(f.top<(a._helper? +e.top:0))a.size.height+=a._helper?a.position.top-e.top:a.position.top,c&&(a.size.width=a.size.height*h.aspectRatio),a.position.top=a._helper?e.top:0;a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;h=Math.abs(a.offset.left-i.left+a.sizeDiff.width);e=Math.abs((a._helper?a.offset.top-i.top:a.offset.top-e.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);i=/relative|absolute/.test(a.containerElement.css("position"));f&&i&&(h-=a.parentData.left); +h+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-h,c&&(a.size.height=a.size.width/a.aspectRatio));e+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-e,c&&(a.size.width=a.size.height*a.aspectRatio))},stop:function(){var a=b(this).data("resizable"),c=a.options,h=a.containerOffset,e=a.containerPosition,f=a.containerElement,i=b(a.helper),j=i.offset(),k=i.outerWidth()-a.sizeDiff.width,i=i.outerHeight()-a.sizeDiff.height;a._helper&&(!c.animate&&/relative/.test(f.css("position")))&& +b(this).css({left:j.left-e.left-h.left,width:k,height:i});a._helper&&(!c.animate&&/static/.test(f.css("position")))&&b(this).css({left:j.left-e.left-h.left,width:k,height:i})}});b.ui.plugin.add("resizable","ghost",{start:function(){var a=b(this).data("resizable"),c=a.options,h=a.size;a.ghost=a.originalElement.clone();a.ghost.css({opacity:0.25,display:"block",position:"relative",height:h.height,width:h.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof c.ghost?c.ghost: +"");a.ghost.appendTo(a.helper)},resize:function(){var a=b(this).data("resizable");a.ghost&&a.ghost.css({position:"relative",height:a.size.height,width:a.size.width})},stop:function(){var a=b(this).data("resizable");a.ghost&&a.helper&&a.helper.get(0).removeChild(a.ghost.get(0))}});b.ui.plugin.add("resizable","grid",{resize:function(){var a=b(this).data("resizable"),c=a.options,h=a.size,e=a.originalSize,f=a.originalPosition,i=a.axis;c.grid="number"==typeof c.grid?[c.grid,c.grid]:c.grid;var j=Math.round((h.width- +e.width)/(c.grid[0]||1))*(c.grid[0]||1),c=Math.round((h.height-e.height)/(c.grid[1]||1))*(c.grid[1]||1);/^(se|s|e)$/.test(i)?(a.size.width=e.width+j,a.size.height=e.height+c):/^(ne)$/.test(i)?(a.size.width=e.width+j,a.size.height=e.height+c,a.position.top=f.top-c):(/^(sw)$/.test(i)?(a.size.width=e.width+j,a.size.height=e.height+c):(a.size.width=e.width+j,a.size.height=e.height+c,a.position.top=f.top-c),a.position.left=f.left-j)}});var a=function(b){return parseInt(b,10)||0},c=function(b){return!isNaN(parseInt(b, +10))}})(jQuery); +(function(b){b.widget("ui.selectable",b.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var a=this;this.element.addClass("ui-selectable");this.dragged=!1;var c;this.refresh=function(){c=b(a.options.filter,a.element[0]);c.each(function(){var a=b(this),c=a.offset();b.data(this,"selectable-item",{element:this,$element:a,left:c.left,top:c.top,right:c.left+a.outerWidth(),bottom:c.top+a.outerHeight(),startselected:!1,selected:a.hasClass("ui-selected"),selecting:a.hasClass("ui-selecting"), +unselecting:a.hasClass("ui-unselecting")})})};this.refresh();this.selectees=c.addClass("ui-selectee");this._mouseInit();this.helper=b("
")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(a){var c=this;this.opos=[a.pageX,a.pageY];if(!this.options.disabled){var d= +this.options;this.selectees=b(d.filter,this.element[0]);this._trigger("start",a);b(d.appendTo).append(this.helper);this.helper.css({left:a.clientX,top:a.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var d=b.data(this,"selectable-item");d.startselected=!0;a.metaKey||(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",a,{unselecting:d.element}))});b(a.target).parents().andSelf().each(function(){var d= +b.data(this,"selectable-item");if(d){var h=!a.metaKey||!d.$element.hasClass("ui-selected");d.$element.removeClass(h?"ui-unselecting":"ui-selected").addClass(h?"ui-selecting":"ui-unselecting");d.unselecting=!h;d.selecting=h;(d.selected=h)?c._trigger("selecting",a,{selecting:d.element}):c._trigger("unselecting",a,{unselecting:d.element});return!1}})}},_mouseDrag:function(a){var c=this;this.dragged=!0;if(!this.options.disabled){var d=this.options,g=this.opos[0],h=this.opos[1],e=a.pageX,f=a.pageY;if(g> +e)var i=e,e=g,g=i;h>f&&(i=f,f=h,h=i);this.helper.css({left:g,top:h,width:e-g,height:f-h});this.selectees.each(function(){var i=b.data(this,"selectable-item");if(i&&i.element!=c.element[0]){var k=false;d.tolerance=="touch"?k=!(i.left>e||i.rightf||i.bottomg&&i.righth&&i.bottom *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){var b=this.options;this.containerCache={};this.element.addClass("ui-sortable");this.refresh(); +this.floating=this.items.length?"x"===b.axis||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var b=this.items.length-1;0<=b;b--)this.items[b].item.removeData("sortable-item");return this},_setOption:function(a,c){"disabled"===a?(this.options[a]= +c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):b.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,c){if(this.reverting||this.options.disabled||"static"==this.options.type)return!1;this._refreshItems(a);var d=null,g=this;b(a.target).parents().each(function(){if(b.data(this,"sortable-item")==g)return d=b(this),!1});b.data(a.target,"sortable-item")==g&&(d=b(a.target));if(!d)return!1;if(this.options.handle&&!c){var h=!1;b(this.options.handle,d).find("*").andSelf().each(function(){this== +a.target&&(h=!0)});if(!h)return!1}this.currentItem=d;this._removeCurrentsFromItems();return!0},_mouseStart:function(a,c,d){c=this.options;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition= +this.helper.css("position");b.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder(); +c.containment&&this._setContainment();c.cursor&&(b("body").css("cursor")&&(this._storedCursor=b("body").css("cursor")),b("body").css("cursor",c.cursor));c.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",c.opacity));c.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",c.zIndex));this.scrollParent[0]!=document&&"HTML"!=this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()); +this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(d=this.containers.length-1;0<=d;d--)this.containers[d]._trigger("activate",a,this._uiHash(this));b.ui.ddmanager&&(b.ui.ddmanager.current=this);b.ui.ddmanager&&!c.dropBehaviour&&b.ui.ddmanager.prepareOffsets(this,a);this.dragging=!0;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return!0},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute"); +this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&"HTML"!=this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageYb[this.floating?"width":"height"]?g+k>i&&g+ke&&c+lthis.containment[2]&&(h=this.containment[2]+this.offset.click.left),a.pageY-this.offset.click.top>this.containment[3]&&(e=this.containment[3]+this.offset.click.top)),c.grid))e=this.originalPageY+Math.round((e-this.originalPageY)/c.grid[1])*c.grid[1],e=this.containment?!(e-this.offset.click.topthis.containment[3])?e:!(e-this.offset.click.top< +this.containment[1])?e-c.grid[1]:e+c.grid[1]:e,h=this.originalPageX+Math.round((h-this.originalPageX)/c.grid[0])*c.grid[0],h=this.containment?!(h-this.offset.click.leftthis.containment[2])?h:!(h-this.offset.click.left li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,c=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");a.headers= +a.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){c.disabled||b(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){c.disabled||b(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){c.disabled||b(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){c.disabled||b(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); +if(c.navigation){var d=a.element.find("a").filter(c.navigationFilter).eq(0);if(d.length){var g=d.closest(".ui-accordion-header");a.active=g.length?g:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion", +function(b){return a._keydown(b)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);b.browser.safari||a.headers.find("a").attr("tabIndex",-1);c.event&&a.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(b){a._clickHandler.call(a,b,this);b.preventDefault()})},_createIcons:function(){var a= +this.options;a.icons&&(b("").addClass("ui-icon "+a.icons.header).prependTo(this.headers),this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected),this.element.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"); +this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var c=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");(a.autoHeight||a.fillHeight)&&c.css("height","");return b.Widget.prototype.destroy.call(this)},_setOption:function(a,c){b.Widget.prototype._setOption.apply(this,arguments);"active"==a&&this.activate(c);"icons"==a&&(this._destroyIcons(), +c&&this._createIcons());if("disabled"==a)this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!this.options.disabled&&!a.altKey&&!a.ctrlKey){var c=b.ui.keyCode,d=this.headers.length,g=this.headers.index(a.target),h=!1;switch(a.keyCode){case c.RIGHT:case c.DOWN:h=this.headers[(g+1)%d];break;case c.LEFT:case c.UP:h=this.headers[(g-1+d)%d];break;case c.SPACE:case c.ENTER:this._clickHandler({target:a.target},a.target),a.preventDefault()}return h? +(b(a.target).attr("tabIndex",-1),b(h).attr("tabIndex",0),h.focus(),!1):!0}},resize:function(){var a=this.options,c;if(a.fillSpace){if(b.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height();b.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){c-=b(this).outerHeight(!0)});this.headers.next().each(function(){b(this).height(Math.max(0,c-b(this).innerHeight()+b(this).height()))}).css("overflow", +"auto")}else a.autoHeight&&(c=0,this.headers.next().each(function(){c=Math.max(c,b(this).height("").height())}).height(c));return this},activate:function(b){this.options.active=b;b=this._findActive(b)[0];this._clickHandler({target:b},b);return this},_findActive:function(a){return a?"number"===typeof a?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):!1===a?b([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,c){var d=this.options;if(!d.disabled)if(a.target){var g=b(a.currentTarget|| +c),h=g[0]===this.active[0];d.active=d.collapsible&&h?!1:this.headers.index(g);if(!(this.running||!d.collapsible&&h)){var e=this.active,f=g.next(),i=this.active.next(),j={options:d,newHeader:h&&d.collapsible?b([]):g,oldHeader:this.active,newContent:h&&d.collapsible?b([]):f,oldContent:i},k=this.headers.index(this.active[0])>this.headers.index(g[0]);this.active=h?b([]):g;this._toggle(f,i,j,h,k);e.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); +h||(g.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected),g.next().addClass("ui-accordion-content-active"))}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var i=this.active.next(), +j={options:d,newHeader:b([]),oldHeader:d.active,newContent:b([]),oldContent:i},f=this.active=b([]);this._toggle(f,i,j)}},_toggle:function(a,c,d,g,h){var e=this,f=e.options;e.toShow=a;e.toHide=c;e.data=d;var i=function(){if(e)return e._completed.apply(e,arguments)};e._trigger("changestart",null,e.data);e.running=0===c.size()?a.size():c.size();if(f.animated){d={};d=f.collapsible&&g?{toShow:b([]),toHide:c,complete:i,down:h,autoHeight:f.autoHeight||f.fillSpace}:{toShow:a,toHide:c,complete:i,down:h,autoHeight:f.autoHeight|| +f.fillSpace};f.proxied||(f.proxied=f.animated);f.proxiedDuration||(f.proxiedDuration=f.duration);f.animated=b.isFunction(f.proxied)?f.proxied(d):f.proxied;f.duration=b.isFunction(f.proxiedDuration)?f.proxiedDuration(d):f.proxiedDuration;var g=b.ui.accordion.animations,j=f.duration,k=f.animated;k&&(!g[k]&&!b.easing[k])&&(k="slide");g[k]||(g[k]=function(b){this.slide(b,{easing:k,duration:j||700})});g[k](d)}else f.collapsible&&g?a.toggle():(c.hide(),a.show()),i(!0);c.prev().attr({"aria-expanded":"false", +"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(b){this.running=b?0:--this.running;this.running||(this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""}),this.toHide.removeClass("ui-accordion-content-active"),this.toHide.length&&(this.toHide.parent()[0].className=this.toHide.parent()[0].className),this._trigger("change",null,this.data))}});b.extend(b.ui.accordion,{version:"1.8.14", +animations:{slide:function(a,c){a=b.extend({easing:"swing",duration:300},a,c);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),g=0,h={},e={},f,i=a.toShow;f=i[0].style.width;i.width(parseInt(i.parent().width(),10)-parseInt(i.css("paddingLeft"),10)-parseInt(i.css("paddingRight"),10)-(parseInt(i.css("borderLeftWidth"),10)||0)-(parseInt(i.css("borderRightWidth"),10)||0));b.each(["height","paddingTop","paddingBottom"],function(c,f){e[f]="hide";var i=(""+b.css(a.toShow[0],f)).match(/^([\d+-.]+)(.*)$/); +h[f]={value:i[1],unit:i[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(e,{step:function(b,c){"height"==c.prop&&(g=0===c.end-c.start?0:(c.now-c.start)/(c.end-c.start));a.toShow[0].style[c.prop]=g*h[c.prop].value+h[c.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:f,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide", +paddingTop:"hide",paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(b){this.slide(b,{easing:b.down?"easeOutBounce":"swing",duration:b.down?1E3:200})}}})})(jQuery); +(function(b){var a=0;b.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var c=this,a=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(a){if(!c.options.disabled&&!c.element.attr("readonly")){g=!1;var d= +b.ui.keyCode;switch(a.keyCode){case d.PAGE_UP:c._move("previousPage",a);break;case d.PAGE_DOWN:c._move("nextPage",a);break;case d.UP:c._move("previous",a);a.preventDefault();break;case d.DOWN:c._move("next",a);a.preventDefault();break;case d.ENTER:case d.NUMPAD_ENTER:c.menu.active&&(g=!0,a.preventDefault());case d.TAB:if(!c.menu.active)break;c.menu.select(a);break;case d.ESCAPE:c.element.val(c.term);c.close(a);break;default:clearTimeout(c.searching),c.searching=setTimeout(function(){c.term!=c.element.val()&& +(c.selectedItem=null,c.search(null,a))},c.options.delay)}}}).bind("keypress.autocomplete",function(b){g&&(g=!1,b.preventDefault())}).bind("focus.autocomplete",function(){c.options.disabled||(c.selectedItem=null,c.previous=c.element.val())}).bind("blur.autocomplete",function(b){c.options.disabled||(clearTimeout(c.searching),c.closing=setTimeout(function(){c.close(b);c._change(b)},150))});this._initSource();this.response=function(){return c._response.apply(c,arguments)};this.menu=b("
    ").addClass("ui-autocomplete").appendTo(b(this.options.appendTo|| +"body",a)[0]).mousedown(function(a){var d=c.menu.element[0];b(a.target).closest(".ui-menu-item").length||setTimeout(function(){b(document).one("mousedown",function(a){a.target!==c.element[0]&&(a.target!==d&&!b.ui.contains(d,a.target))&&c.close()})},1);setTimeout(function(){clearTimeout(c.closing)},13)}).menu({focus:function(b,a){var f=a.item.data("item.autocomplete");!1!==c._trigger("focus",b,{item:f})&&/^key/.test(b.originalEvent.type)&&c.element.val(f.value)},selected:function(b,e){var f=e.item.data("item.autocomplete"), +i=c.previous;c.element[0]!==a.activeElement&&(c.element.focus(),c.previous=i,setTimeout(function(){c.previous=i;c.selectedItem=f},1));!1!==c._trigger("select",b,{item:f})&&c.element.val(f.value);c.term=c.element.val();c.close(b);c.selectedItem=f},blur:function(){c.menu.element.is(":visible")&&c.element.val()!==c.term&&c.element.val(c.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");b.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"); +this.menu.element.remove();b.Widget.prototype.destroy.call(this)},_setOption:function(a,d){b.Widget.prototype._setOption.apply(this,arguments);"source"===a&&this._initSource();"appendTo"===a&&this.menu.element.appendTo(b(d||"body",this.element[0].ownerDocument)[0]);"disabled"===a&&(d&&this.xhr)&&this.xhr.abort()},_initSource:function(){var c=this,d,g;b.isArray(this.options.source)?(d=this.options.source,this.source=function(a,c){c(b.ui.autocomplete.filter(d,a.term))}):"string"===typeof this.options.source? +(g=this.options.source,this.source=function(d,e){c.xhr&&c.xhr.abort();c.xhr=b.ajax({url:g,data:d,dataType:"json",autocompleteRequest:++a,success:function(b){this.autocompleteRequest===a&&e(b)},error:function(){this.autocompleteRequest===a&&e([])}})}):this.source=this.options.source},search:function(b,a){b=null!=b?b:this.element.val();this.term=this.element.val();if(b.length").data("item.autocomplete",d).append(b("").text(d.label)).appendTo(a)},_move:function(b,a){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(b)||this.menu.last()&& +/^next/.test(b))this.element.val(this.term),this.menu.deactivate();else this.menu[b](a);else this.search(null,a)},widget:function(){return this.menu.element}});b.extend(b.ui.autocomplete,{escapeRegex:function(b){return b.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(a,d){var g=RegExp(b.ui.autocomplete.escapeRegex(d),"i");return b.grep(a,function(b){return g.test(b.label||b.value||b)})}})})(jQuery); +(function(b){b.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){b(c.target).closest(".ui-menu-item a").length&&(c.preventDefault(),a.select(c))});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", +-1).mouseenter(function(c){a.activate(c,b(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(b,c){this.deactivate();if(this.hasScroll()){var d=c.offset().top-this.element.offset().top,g=this.element.scrollTop(),h=this.element.height();0>d?this.element.scrollTop(g+d):d>=h&&this.element.scrollTop(g+d-h+c.height())}this.active=c.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",b,{item:c})},deactivate:function(){this.active&& +(this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null)},next:function(b){this.move("next",".ui-menu-item:first",b)},previous:function(b){this.move("prev",".ui-menu-item:last",b)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(b,c,d){this.active?(b=this.active[b+"All"](".ui-menu-item").eq(0),b.length?this.activate(d, +b):this.activate(d,this.element.children(c))):this.activate(d,this.element.children(c))},nextPage:function(a){if(this.hasScroll())if(!this.active||this.last())this.activate(a,this.element.children(".ui-menu-item:first"));else{var c=this.active.offset().top,d=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var a=b(this).offset().top-c-d+b(this).height();return 10>a&&-10a&&-10").addClass("ui-button-text").html(this.options.label).appendTo(a.empty()).text(),d=this.options.icons,h=d.primary&&d.secondary,e=[];d.primary||d.secondary?(this.options.text&&e.push("ui-button-text-icon"+(h?"s":d.primary?"-primary":"-secondary")),d.primary&&a.prepend(""),d.secondary&&a.append(""),this.options.text||(e.push(h?"ui-button-icons-only": +"ui-button-icon-only"),this.hasTitle||a.attr("title",c))):e.push("ui-button-text-only");a.addClass(e.join(" "))}}});b.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(a,c){"disabled"===a&&this.buttons.button("option",a,c);b.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var a="ltr"===this.element.css("direction"); +this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(a?"ui-corner-left":"ui-corner-right").end().filter(":last").addClass(a?"ui-corner-right":"ui-corner-left").end().end()},destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"); +b.Widget.prototype.destroy.call(this)}})})(jQuery); +(function(b,a){var c={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},d={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},g=b.attrFn||{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0,click:!0};b.widget("ui.dialog",{options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",collision:"fit",using:function(a){var c= +b(this).css(a).offset().top;0>c&&b(this).css("top",a.top-c)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");"string"!==typeof this.originalTitle&&(this.originalTitle="");this.options.title=this.options.title||this.originalTitle;var a=this,c=a.options,f=c.title||" ",i=b.ui.dialog.getTitleId(a.element),d=(a.uiDialog=b("
    ")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+ +c.dialogClass).css({zIndex:c.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(f){if(c.closeOnEscape&&f.keyCode&&f.keyCode===b.ui.keyCode.ESCAPE){a.close(f);f.preventDefault()}}).attr({role:"dialog","aria-labelledby":i}).mousedown(function(b){a.moveToTop(false,b)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(d);var g=(a.uiDialogTitlebar=b("
    ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(d), +l=b('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){l.addClass("ui-state-hover")},function(){l.removeClass("ui-state-hover")}).focus(function(){l.addClass("ui-state-focus")}).blur(function(){l.removeClass("ui-state-focus")}).click(function(b){a.close(b);return false}).appendTo(g);(a.uiDialogTitlebarCloseText=b("")).addClass("ui-icon ui-icon-closethick").text(c.closeText).appendTo(l);b("").addClass("ui-dialog-title").attr("id", +i).html(f).prependTo(g);b.isFunction(c.beforeclose)&&!b.isFunction(c.beforeClose)&&(c.beforeClose=c.beforeclose);g.find("*").add(g).disableSelection();c.draggable&&b.fn.draggable&&a._makeDraggable();c.resizable&&b.fn.resizable&&a._makeResizable();a._createButtons(c.buttons);a._isOpen=!1;b.fn.bgiframe&&d.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){this.overlay&&this.overlay.destroy();this.uiDialog.hide();this.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"); +this.uiDialog.remove();this.originalTitle&&this.element.attr("title",this.originalTitle);return this},widget:function(){return this.uiDialog},close:function(a){var c=this,f,d;if(!1!==c._trigger("beforeClose",a))return c.overlay&&c.overlay.destroy(),c.uiDialog.unbind("keypress.ui-dialog"),c._isOpen=!1,c.options.hide?c.uiDialog.hide(c.options.hide,function(){c._trigger("close",a)}):(c.uiDialog.hide(),c._trigger("close",a)),b.ui.dialog.overlay.resize(),c.options.modal&&(f=0,b(".ui-dialog").each(function(){if(this!== +c.uiDialog[0]){d=b(this).css("z-index");isNaN(d)||(f=Math.max(f,d))}}),b.ui.dialog.maxZ=f),c},isOpen:function(){return this._isOpen},moveToTop:function(a,c){var f=this.options;if(f.modal&&!a||!f.stack&&!f.modal)return this._trigger("focus",c);f.zIndex>b.ui.dialog.maxZ&&(b.ui.dialog.maxZ=f.zIndex);this.overlay&&(b.ui.dialog.maxZ+=1,this.overlay.$el.css("z-index",b.ui.dialog.overlay.maxZ=b.ui.dialog.maxZ));f={scrollTop:this.element.attr("scrollTop"),scrollLeft:this.element.attr("scrollLeft")};b.ui.dialog.maxZ+= +1;this.uiDialog.css("z-index",b.ui.dialog.maxZ);this.element.attr(f);this._trigger("focus",c);return this},open:function(){if(!this._isOpen){var a=this.options,c=this.uiDialog;this.overlay=a.modal?new b.ui.dialog.overlay(this):null;this._size();this._position(a.position);c.show(a.show);this.moveToTop(!0);a.modal&&c.bind("keypress.ui-dialog",function(a){if(a.keyCode===b.ui.keyCode.TAB){var c=b(":tabbable",this),d=c.filter(":first"),c=c.filter(":last");if(a.target===c[0]&&!a.shiftKey)return d.focus(1), +!1;if(a.target===d[0]&&a.shiftKey)return c.focus(1),!1}});b(this.element.find(":tabbable").get().concat(c.find(".ui-dialog-buttonpane :tabbable").get().concat(c.get()))).eq(0).focus();this._isOpen=!0;this._trigger("open");return this}},_createButtons:function(a){var c=this,f=!1,d=b("
    ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),j=b("
    ").addClass("ui-dialog-buttonset").appendTo(d);c.uiDialog.find(".ui-dialog-buttonpane").remove();"object"===typeof a&& +null!==a&&b.each(a,function(){return!(f=!0)});f&&(b.each(a,function(a,f){var f=b.isFunction(f)?{click:f,text:a}:f,d=b('').click(function(){f.click.apply(c.element[0],arguments)}).appendTo(j);b.each(f,function(b,a){if("click"!==b)if(b in g)d[b](a);else d.attr(b,a)});b.fn.button&&d.button()}),d.appendTo(c.uiDialog))},_makeDraggable:function(){function a(b){return{position:b.position,offset:b.offset}}var c=this,f=c.options,d=b(document),g;c.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close", +handle:".ui-dialog-titlebar",containment:"document",start:function(d,i){g="auto"===f.height?"auto":b(this).height();b(this).height(b(this).height()).addClass("ui-dialog-dragging");c._trigger("dragStart",d,a(i))},drag:function(b,f){c._trigger("drag",b,a(f))},stop:function(k,l){f.position=[l.position.left-d.scrollLeft(),l.position.top-d.scrollTop()];b(this).removeClass("ui-dialog-dragging").height(g);c._trigger("dragStop",k,a(l));b.ui.dialog.overlay.resize()}})},_makeResizable:function(c){function d(b){return{originalPosition:b.originalPosition, +originalSize:b.originalSize,position:b.position,size:b.size}}var c=c===a?this.options.resizable:c,f=this,i=f.options,g=f.uiDialog.css("position"),c="string"===typeof c?c:"n,e,s,w,se,sw,ne,nw";f.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:f.element,maxWidth:i.maxWidth,maxHeight:i.maxHeight,minWidth:i.minWidth,minHeight:f._minHeight(),handles:c,start:function(a,c){b(this).addClass("ui-dialog-resizing");f._trigger("resizeStart",a,d(c))},resize:function(b,a){f._trigger("resize", +b,d(a))},stop:function(a,c){b(this).removeClass("ui-dialog-resizing");i.height=b(this).height();i.width=b(this).width();f._trigger("resizeStop",a,d(c));b.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var b=this.options;return"auto"===b.height?b.minHeight:Math.min(b.minHeight,b.height)},_position:function(a){var c=[],f=[0,0],d;if(a){if("string"===typeof a||"object"===typeof a&&"0"in a)c=a.split?a.split(" "): +[a[0],a[1]],1===c.length&&(c[1]=c[0]),b.each(["left","top"],function(b,a){+c[b]===c[b]&&(f[b]=c[b],c[b]=a)}),a={my:c.join(" "),at:c.join(" "),offset:f.join(" ")};a=b.extend({},b.ui.dialog.prototype.options.position,a)}else a=b.ui.dialog.prototype.options.position;(d=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(b.extend({of:window},a));d||this.uiDialog.hide()},_setOptions:function(a){var g=this,f={},i=!1;b.each(a,function(b,a){g._setOption(b,a);b in +c&&(i=!0);b in d&&(f[b]=a)});i&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",f)},_setOption:function(a,c){var f=this.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":this._createButtons(c);break;case "closeText":this.uiDialogTitlebarCloseText.text(""+c);break;case "dialogClass":f.removeClass(this.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+c);break;case "disabled":c?f.addClass("ui-dialog-disabled"): +f.removeClass("ui-dialog-disabled");break;case "draggable":var d=f.is(":data(draggable)");d&&!c&&f.draggable("destroy");!d&&c&&this._makeDraggable();break;case "position":this._position(c);break;case "resizable":(d=f.is(":data(resizable)"))&&!c&&f.resizable("destroy");d&&"string"===typeof c&&f.resizable("option","handles",c);!d&&!1!==c&&this._makeResizable(c);break;case "title":b(".ui-dialog-title",this.uiDialogTitlebar).html(""+(c||" "))}b.Widget.prototype._setOption.apply(this,arguments)}, +_size:function(){var a=this.options,c,f,d=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});a.minWidth>a.width&&(a.width=a.minWidth);c=this.uiDialog.css({height:"auto",width:a.width}).height();f=Math.max(0,a.minHeight-c);"auto"===a.height?b.support.minHeight?this.element.css({minHeight:f,height:"auto"}):(this.uiDialog.show(),a=this.element.css("height","auto").height(),d||this.uiDialog.hide(),this.element.height(Math.max(a,f))):this.element.height(Math.max(a.height- +c,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});b.extend(b.ui.dialog,{version:"1.8.14",uuid:0,maxZ:0,getTitleId:function(b){b=b.attr("id");b||(b=this.uuid+=1);return"ui-dialog-title-"+b},overlay:function(a){this.$el=b.ui.dialog.overlay.create(a)}});b.extend(b.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:b.map("focus mousedown mouseup keydown keypress click".split(" "),function(b){return b+".dialog-overlay"}).join(" "), +create:function(a){0===this.instances.length&&(setTimeout(function(){b.ui.dialog.overlay.instances.length&&b(document).bind(b.ui.dialog.overlay.events,function(a){if(b(a.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(), +height:this.height()});b.fn.bgiframe&&c.bgiframe();this.instances.push(c);return c},destroy:function(a){var c=b.inArray(a,this.instances);-1!=c&&this.oldInstances.push(this.instances.splice(c,1)[0]);0===this.instances.length&&b([document,window]).unbind(".dialog-overlay");a.remove();var f=0;b.each(this.instances,function(){f=Math.max(f,this.css("z-index"))});this.maxZ=f},height:function(){var a,c;return b.browser.msie&&7>b.browser.version?(a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight), +c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight),a").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+("min"===c.range||"max"===c.range?" ui-slider-range-"+c.range:""))}for(var e=d.length;e"); +this.handles=d.add(b(h.join("")).appendTo(a.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(b){b.preventDefault()}).hover(function(){c.disabled||b(this).addClass("ui-state-hover")},function(){b(this).removeClass("ui-state-hover")}).focus(function(){c.disabled?b(this).blur():(b(".ui-slider .ui-state-focus").removeClass("ui-state-focus"),b(this).addClass("ui-state-focus"))}).blur(function(){b(this).removeClass("ui-state-focus")});this.handles.each(function(a){b(this).data("index.ui-slider-handle", +a)});this.handles.keydown(function(c){var d=!0,g=b(this).data("index.ui-slider-handle"),e,h,m;if(!a.options.disabled){switch(c.keyCode){case b.ui.keyCode.HOME:case b.ui.keyCode.END:case b.ui.keyCode.PAGE_UP:case b.ui.keyCode.PAGE_DOWN:case b.ui.keyCode.UP:case b.ui.keyCode.RIGHT:case b.ui.keyCode.DOWN:case b.ui.keyCode.LEFT:if(d=!1,!a._keySliding&&(a._keySliding=!0,b(this).addClass("ui-state-active"),e=a._start(c,g),!1===e))return}m=a.options.step;e=a.options.values&&a.options.values.length?h=a.values(g): +h=a.value();switch(c.keyCode){case b.ui.keyCode.HOME:h=a._valueMin();break;case b.ui.keyCode.END:h=a._valueMax();break;case b.ui.keyCode.PAGE_UP:h=a._trimAlignValue(e+(a._valueMax()-a._valueMin())/5);break;case b.ui.keyCode.PAGE_DOWN:h=a._trimAlignValue(e-(a._valueMax()-a._valueMin())/5);break;case b.ui.keyCode.UP:case b.ui.keyCode.RIGHT:if(e===a._valueMax())return;h=a._trimAlignValue(e+m);break;case b.ui.keyCode.DOWN:case b.ui.keyCode.LEFT:if(e===a._valueMin())return;h=a._trimAlignValue(e-m)}a._slide(c, +g,h);return d}}).keyup(function(c){var d=b(this).data("index.ui-slider-handle");a._keySliding&&(a._keySliding=!1,a._stop(c,d),a._change(c,d),b(this).removeClass("ui-state-active"))});this._refreshValue();this._animateOff=!1},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy();return this},_mouseCapture:function(a){var c= +this.options,d,g,h,e,f;if(c.disabled)return!1;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();d=this._normValueFromMouse({x:a.pageX,y:a.pageY});g=this._valueMax()-this._valueMin()+1;e=this;this.handles.each(function(a){var c=Math.abs(d-e.values(a));g>c&&(g=c,h=b(this),f=a)});!0===c.range&&this.values(1)===c.min&&(f+=1,h=b(this.handles[f]));if(!1===this._start(a,f))return!1;this._mouseSliding=!0;e._handleIndex=f;h.addClass("ui-state-active").focus(); +c=h.offset();this._clickOffset=!b(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-c.left-h.width()/2,top:a.pageY-c.top-h.height()/2-(parseInt(h.css("borderTopWidth"),10)||0)-(parseInt(h.css("borderBottomWidth"),10)||0)+(parseInt(h.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(a,f,d);return this._animateOff=!0},_mouseStart:function(){return!0},_mouseDrag:function(b){var c=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b, +this._handleIndex,c);return!1},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=!1;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(b){var c;"horizontal"===this.orientation?(c=this.elementSize.width,b=b.x-this.elementOffset.left-(this._clickOffset? +this._clickOffset.left:0)):(c=this.elementSize.height,b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0));c=b/c;1c&&(c=0);"vertical"===this.orientation&&(c=1-c);b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+c*b)},_start:function(b,c){var d={handle:this.handles[c],value:this.value()};this.options.values&&this.options.values.length&&(d.value=this.values(c),d.values=this.values());return this._trigger("start",b,d)},_slide:function(b, +c,d){var g;if(this.options.values&&this.options.values.length){g=this.values(c?0:1);if(2===this.options.values.length&&!0===this.options.range&&(0===c&&d>g||1===c&&d=this._valueMax())return this._valueMax();var c=0=c&&(alignValue+=0",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(!0)},_setOption:function(b,a){"selected"==b?this.options.collapsible&&a==this.options.selected||this.select(a): +(this.options[b]=a,this._tabify())},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+ ++c},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var a=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+ ++d);return b.cookie.apply(null,[a].concat(b.makeArray(arguments)))},_ui:function(b,a){return{tab:b,panel:a,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var a= +b(this);a.html(a.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function d(a,c){a.css("display","");!b.support.opacity&&c.opacity&&a[0].style.removeAttribute("filter")}var e=this,f=this.options,i=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=b(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return b("a",this)[0]});this.panels=b([]);this.anchors.each(function(a,c){var d=b(c).attr("href"),g=d.split("#")[0],h;if(g&&(g===location.toString().split("#")[0]|| +(h=b("base")[0])&&g===h.href))d=c.hash,c.href=d;i.test(d)?e.panels=e.panels.add(e.element.find(e._sanitizeSelector(d))):d&&"#"!==d?(b.data(c,"href.tabs",d),b.data(c,"load.tabs",d.replace(/#.*$/,"")),d=e._tabId(c),c.href="#"+d,g=e.element.find("#"+d),g.length||(g=b(f.panelTemplate).attr("id",d).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(e.panels[a-1]||e.list),g.data("destroy.tabs",!0)),e.panels=e.panels.add(g)):f.disabled.push(a)});c?(this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"), +this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.lis.addClass("ui-state-default ui-corner-top"),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"),f.selected===a?(location.hash&&this.anchors.each(function(b,a){if(a.hash==location.hash)return f.selected=b,!1}),"number"!==typeof f.selected&&f.cookie&&(f.selected=parseInt(e._cookie(),10)),"number"!==typeof f.selected&&this.lis.filter(".ui-tabs-selected").length&&(f.selected= +this.lis.index(this.lis.filter(".ui-tabs-selected"))),f.selected=f.selected||(this.lis.length?0:-1)):null===f.selected&&(f.selected=-1),f.selected=0<=f.selected&&this.anchors[f.selected]||0>f.selected?f.selected:0,f.disabled=b.unique(f.disabled.concat(b.map(this.lis.filter(".ui-state-disabled"),function(b){return e.lis.index(b)}))).sort(),-1!=b.inArray(f.selected,f.disabled)&&f.disabled.splice(b.inArray(f.selected,f.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"), +0<=f.selected&&this.anchors.length&&(e.element.find(e._sanitizeSelector(e.anchors[f.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(f.selected).addClass("ui-tabs-selected ui-state-active"),e.element.queue("tabs",function(){e._trigger("show",null,e._ui(e.anchors[f.selected],e.element.find(e._sanitizeSelector(e.anchors[f.selected].hash))[0]))}),this.load(f.selected)),b(window).bind("unload",function(){e.lis.add(e.anchors).unbind(".tabs");e.lis=e.anchors=e.panels=null})):f.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); +this.element[f.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");f.cookie&&this._cookie(f.selected,f.cookie);for(var c=0,j;j=this.lis[c];c++)b(j)[-1!=b.inArray(c,f.disabled)&&!b(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");!1===f.cache&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if("mouseover"!==f.event){var k=function(b,a){a.is(":not(.ui-state-disabled)")&&a.addClass("ui-state-"+b)};this.lis.bind("mouseover.tabs", +function(){k("hover",b(this))});this.lis.bind("mouseout.tabs",function(){b(this).removeClass("ui-state-hover")});this.anchors.bind("focus.tabs",function(){k("focus",b(this).closest("li"))});this.anchors.bind("blur.tabs",function(){b(this).closest("li").removeClass("ui-state-focus")})}var l,m;f.fx&&(b.isArray(f.fx)?(l=f.fx[0],m=f.fx[1]):l=m=f.fx);var p=m?function(a,c){b(a).closest("li").addClass("ui-tabs-selected ui-state-active");c.hide().removeClass("ui-tabs-hide").animate(m,m.duration||"normal", +function(){d(c,m);e._trigger("show",null,e._ui(a,c[0]))})}:function(a,c){b(a).closest("li").addClass("ui-tabs-selected ui-state-active");c.removeClass("ui-tabs-hide");e._trigger("show",null,e._ui(a,c[0]))},n=l?function(b,a){a.animate(l,l.duration||"normal",function(){e.lis.removeClass("ui-tabs-selected ui-state-active");a.addClass("ui-tabs-hide");d(a,l);e.element.dequeue("tabs")})}:function(b,a){e.lis.removeClass("ui-tabs-selected ui-state-active");a.addClass("ui-tabs-hide");e.element.dequeue("tabs")}; +this.anchors.bind(f.event+".tabs",function(){var a=this,c=b(a).closest("li"),d=e.panels.filter(":not(.ui-tabs-hide)"),i=e.element.find(e._sanitizeSelector(a.hash));if(c.hasClass("ui-tabs-selected")&&!f.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||e.panels.filter(":animated").length||e._trigger("select",null,e._ui(this,i[0]))===false){this.blur();return false}f.selected=e.anchors.index(this);e.abort();if(f.collapsible){if(c.hasClass("ui-tabs-selected")){f.selected= +-1;f.cookie&&e._cookie(f.selected,f.cookie);e.element.queue("tabs",function(){n(a,d)}).dequeue("tabs");this.blur();return false}if(!d.length){f.cookie&&e._cookie(f.selected,f.cookie);e.element.queue("tabs",function(){p(a,i)});e.load(e.anchors.index(this));this.blur();return false}}f.cookie&&e._cookie(f.selected,f.cookie);if(i.length){d.length&&e.element.queue("tabs",function(){n(a,d)});e.element.queue("tabs",function(){p(a,i)});e.load(e.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; +b.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){"string"==typeof b&&(b=this.anchors.index(this.anchors.filter("[href$="+b+"]")));return b},destroy:function(){var a=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var a= +b.data(this,"href.tabs");a&&(this.href=a);var c=b(this).unbind(".tabs");b.each(["href","load","cache"],function(b,a){c.removeData(a+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){b.data(this,"destroy.tabs")?b(this).remove():b(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});a.cookie&&this._cookie(null,a.cookie);return this},add:function(c, +d,e){e===a&&(e=this.anchors.length);var f=this,i=this.options,d=b(i.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),c=!c.indexOf("#")?c.replace("#",""):this._tabId(b("a",d)[0]);d.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+c);j.length||(j=b(i.panelTemplate).attr("id",c).data("destroy.tabs",!0));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");e>=this.lis.length?(d.appendTo(this.list),j.appendTo(this.list[0].parentNode)): +(d.insertBefore(this.lis[e]),j.insertBefore(this.panels[e]));i.disabled=b.map(i.disabled,function(b){return b>=e?++b:b});this._tabify();1==this.anchors.length&&(i.selected=0,d.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0));this._trigger("add",null,this._ui(this.anchors[e],this.panels[e]));return this},remove:function(a){var a=this._getIndex(a),c=this.options,d=this.lis.eq(a).remove(), +f=this.panels.eq(a).remove();d.hasClass("ui-tabs-selected")&&1=a?--b:b});this._tabify();this._trigger("remove",null,this._ui(d.find("a")[0],f[0]));return this},enable:function(a){var a=this._getIndex(a),c=this.options;if(-1!=b.inArray(a,c.disabled))return this.lis.eq(a).removeClass("ui-state-disabled"),c.disabled=b.grep(c.disabled,function(b){return b!= +a}),this._trigger("enable",null,this._ui(this.anchors[a],this.panels[a])),this},disable:function(b){var b=this._getIndex(b),a=this.options;b!=a.selected&&(this.lis.eq(b).addClass("ui-state-disabled"),a.disabled.push(b),a.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b])));return this},select:function(b){b=this._getIndex(b);if(-1==b)if(this.options.collapsible&&-1!=this.options.selected)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+ +".tabs");return this},load:function(a){var a=this._getIndex(a),c=this,d=this.options,f=this.anchors.eq(a)[0],i=b.data(f,"load.tabs");this.abort();if(!i||0!==this.element.queue("tabs").length&&b.data(f,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(a).addClass("ui-state-processing");if(d.spinner){var j=b("span",f);j.data("label.tabs",j.html()).html(d.spinner)}this.xhr=b.ajax(b.extend({},d.ajaxOptions,{url:i,success:function(i,j){c.element.find(c._sanitizeSelector(f.hash)).html(i);c._cleanup(); +d.cache&&b.data(f,"cache.tabs",!0);c._trigger("load",null,c._ui(c.anchors[a],c.panels[a]));try{d.ajaxOptions.success(i,j)}catch(m){}},error:function(b,i){c._cleanup();c._trigger("load",null,c._ui(c.anchors[a],c.panels[a]));try{d.ajaxOptions.error(b,i,a,f)}catch(m){}}}));c.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(!1,!0);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));this.xhr&&(this.xhr.abort(),delete this.xhr);this._cleanup(); +return this},url:function(b,a){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",a);return this},length:function(){return this.anchors.length}});b.extend(b.ui.tabs,{version:"1.8.14"});b.extend(b.ui.tabs.prototype,{rotation:null,rotate:function(b,a){var c=this,f=this.options,d=c._rotate||(c._rotate=function(a){clearTimeout(c.rotation);c.rotation=setTimeout(function(){var b=f.selected;c.select(++b'))}function d(a){return a.bind("mouseout",function(a){a=b(a.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a"); +a.length&&a.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(c){c=b(c.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");if(!b.datepicker._isDisabledDatepicker(e.inline?a.parent()[0]:e.input[0])&&c.length)c.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),c.addClass("ui-state-hover"),c.hasClass("ui-datepicker-prev")&&c.addClass("ui-datepicker-prev-hover"),c.hasClass("ui-datepicker-next")&& +c.addClass("ui-datepicker-next-hover")})}function g(c,d){b.extend(c,d);for(var e in d)if(null==d[e]||d[e]==a)c[e]=d[e];return c}b.extend(b.ui,{datepicker:{version:"1.8.14"}});var h=(new Date).getTime(),e;b.extend(c.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(b){g(this._defaults,b||{});return this},_attachDatepicker:function(a,c){var d=null,e;for(e in this._defaults){var g= +a.getAttribute("date:"+e);if(g){d=d||{};try{d[e]=eval(g)}catch(m){d[e]=g}}}e=a.nodeName.toLowerCase();g="div"==e||"span"==e;a.id||(this.uuid+=1,a.id="dp"+this.uuid);var h=this._newInst(b(a),g);h.settings=b.extend({},c||{},d||{});"input"==e?this._connectDatepicker(a,h):g&&this._inlineDatepicker(a,h)},_newInst:function(a,c){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:c,dpDiv:!c?this.dpDiv:d(b('
    '))}},_connectDatepicker:function(a,c){var d=b(a);c.append=b([]);c.trigger=b([]);d.hasClass(this.markerClassName)||(this._attachments(d,c),d.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(b,a,f){c.settings[a]=f}).bind("getData.datepicker",function(b,a){return this._get(c,a)}),this._autoSize(c),b.data(a,"datepicker", +c))},_attachments:function(a,c){var d=this._get(c,"appendText"),e=this._get(c,"isRTL");c.append&&c.append.remove();d&&(c.append=b(''+d+""),a[e?"before":"after"](c.append));a.unbind("focus",this._showDatepicker);c.trigger&&c.trigger.remove();d=this._get(c,"showOn");("focus"==d||"both"==d)&&a.focus(this._showDatepicker);if("button"==d||"both"==d){var d=this._get(c,"buttonText"),g=this._get(c,"buttonImage");c.trigger=b(this._get(c,"buttonImageOnly")?b("").addClass(this._triggerClass).attr({src:g, +alt:d,title:d}):b('').addClass(this._triggerClass).html(""==g?d:b("").attr({src:g,alt:d,title:d})));a[e?"before":"after"](c.trigger);c.trigger.click(function(){b.datepicker._datepickerShowing&&b.datepicker._lastInput==a[0]?b.datepicker._hideDatepicker():b.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(b){if(this._get(b,"autoSize")&&!b.inline){var a=new Date(2009,11,20),c=this._get(b,"dateFormat");if(c.match(/[DM]/)){var d=function(b){for(var a= +0,c=0,f=0;fa&&(a=b[f].length,c=f);return c};a.setMonth(d(this._get(b,c.match(/MM/)?"monthNames":"monthNamesShort")));a.setDate(d(this._get(b,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())}b.input.attr("size",this._formatDate(b,a).length)}},_inlineDatepicker:function(a,c){var d=b(a);d.hasClass(this.markerClassName)||(d.addClass(this.markerClassName).append(c.dpDiv).bind("setData.datepicker",function(b,a,f){c.settings[a]=f}).bind("getData.datepicker",function(b, +a){return this._get(c,a)}),b.data(a,"datepicker",c),this._setDate(c,this._getDefaultDate(c),!0),this._updateDatepicker(c),this._updateAlternate(c),c.dpDiv.show())},_dialogDatepicker:function(a,c,d,e,h){a=this._dialogInst;a||(this.uuid+=1,this._dialogInput=b(''),this._dialogInput.keydown(this._doKeyDown),b("body").append(this._dialogInput),a=this._dialogInst=this._newInst(this._dialogInput,!1), +a.settings={},b.data(this._dialogInput[0],"datepicker",a));g(a.settings,e||{});c=c&&c.constructor==Date?this._formatDate(a,c):c;this._dialogInput.val(c);this._pos=h?h.length?h:[h.pageX,h.pageY]:null;this._pos||(this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)]);this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+ +"px");a.settings.onSelect=d;this._inDialog=!0;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);b.blockUI&&b.blockUI(this.dpDiv);b.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var c=b(a),d=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();b.removeData(a,"datepicker");"input"==e?(d.append.remove(),d.trigger.remove(),c.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown", +this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"==e||"span"==e)&&c.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var c=b(a),d=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if("input"==e)a.disabled=!1,d.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if("div"==e||"span"==e)c=c.children("."+this._inlineClass),c.children().removeClass("ui-state-disabled"), +c.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled");this._disabledInputs=b.map(this._disabledInputs,function(b){return b==a?null:b})}},_disableDatepicker:function(a){var c=b(a),d=b.data(a,"datepicker");if(c.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if("input"==e)a.disabled=!0,d.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if("div"==e||"span"==e)c=c.children("."+this._inlineClass), +c.children().addClass("ui-state-disabled"),c.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled");this._disabledInputs=b.map(this._disabledInputs,function(b){return b==a?null:b});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(b){if(!b)return!1;for(var a=0;ae||!d||-1n&&n>e?Math.abs(c.left+e-n):0);c.top-=Math.min(c.top,c.top+g>q&&q>g?Math.abs(g+p):0);return c},_findPos:function(a){for(var c= +this._get(this._getInst(a),"isRTL");a&&("hidden"==a.type||1!=a.nodeType||b.expr.filters.hidden(a));)a=a[c?"previousSibling":"nextSibling"];a=b(a).offset();return[a.left,a.top]},_triggerOnClose:function(a){var b=this._get(a,"onClose");b&&b.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a])},_hideDatepicker:function(a){var c=this._curInst;if(c&&!(a&&c!=b.data(a,"datepicker"))&&this._datepickerShowing){var a=this._get(c,"showAnim"),d=this._get(c,"duration"),e=function(){b.datepicker._tidyDialog(c); +this._curInst=null};if(b.effects&&b.effects[a])c.dpDiv.hide(a,b.datepicker._get(c,"showOptions"),d,e);else c.dpDiv["slideDown"==a?"slideUp":"fadeIn"==a?"fadeOut":"hide"](a?d:null,e);a||e();b.datepicker._triggerOnClose(c);this._datepickerShowing=!1;this._lastInput=null;this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),b.blockUI&&(b.unblockUI(),b("body").append(this.dpDiv)));this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")}, +_checkExternalClick:function(a){b.datepicker._curInst&&(a=b(a.target),a[0].id!=b.datepicker._mainDivId&&(0==a.parents("#"+b.datepicker._mainDivId).length&&!a.hasClass(b.datepicker.markerClassName)&&!a.hasClass(b.datepicker._triggerClass)&&b.datepicker._datepickerShowing&&(!b.datepicker._inDialog||!b.blockUI))&&b.datepicker._hideDatepicker())},_adjustDate:function(a,c,d){var a=b(a),e=this._getInst(a[0]);this._isDisabledDatepicker(a[0])||(this._adjustInstDate(e,c+("M"==d?this._get(e,"showCurrentAtPos"): +0),d),this._updateDatepicker(e))},_gotoToday:function(a){var a=b(a),c=this._getInst(a[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate();c.drawMonth=c.selectedMonth=d.getMonth();c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c);this._adjustDate(a)},_selectMonthYear:function(a,c,d){var a=b(a),e=this._getInst(a[0]);e._selectingMonthYear= +!1;e["selected"+("M"==d?"Month":"Year")]=e["draw"+("M"==d?"Month":"Year")]=parseInt(c.options[c.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var c=this._getInst(b(a)[0]);c.input&&c._selectingMonthYear&&setTimeout(function(){c.input.focus()},0);c._selectingMonthYear=!c._selectingMonthYear},_selectDay:function(a,c,d,e){var g=b(a);!b(e).hasClass(this._unselectableClass)&&!this._isDisabledDatepicker(g[0])&&(g=this._getInst(g[0]),g.selectedDay=g.currentDay= +b("a",e).html(),g.selectedMonth=g.currentMonth=c,g.selectedYear=g.currentYear=d,this._selectDate(a,this._formatDate(g,g.currentDay,g.currentMonth,g.currentYear)))},_clearDate:function(a){a=b(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,c){var d=this._getInst(b(a)[0]),c=null!=c?c:this._formatDate(d);d.input&&d.input.val(c);this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[c,d]):d.input&&d.input.trigger("change");d.inline?this._updateDatepicker(d): +(this._hideDatepicker(),this._lastInput=d.input[0],"object"!=typeof d.input[0]&&d.input.focus(),this._lastInput=null)},_updateAlternate:function(a){var c=this._get(a,"altField");if(c){var d=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),g=this.formatDate(d,e,this._getFormatConfig(a));b(c).each(function(){b(this).val(g)})}},noWeekends:function(a){a=a.getDay();return[0a,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b= +a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,c,d){if(null==a||null==c)throw"Invalid arguments";c="object"==typeof c?c.toString():c+"";if(""==c)return null;for(var e=(d?d.shortYearCutoff:null)||this._defaults.shortYearCutoff,e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),g=(d?d.dayNamesShort:null)||this._defaults.dayNamesShort,h=(d?d.dayNames:null)||this._defaults.dayNames,p=(d?d.monthNamesShort:null)||this._defaults.monthNamesShort, +n=(d?d.monthNames:null)||this._defaults.monthNames,q=d=-1,o=-1,w=-1,r=!1,u=function(b){(b=E+1d&&(d+=(new Date).getFullYear()-(new Date).getFullYear()%100+(d<=e?0:-100));if(-1b.getYear()%100?"0":"")+b.getYear()%100;break;case "@":o+=b.getTime();break;case "!":o+=1E4*b.getTime()+this._ticksTo1970;break;case "'":h("'")?o+="'":w=!0;break;default:o+=a.charAt(r)}return o},_possibleChars:function(a){for(var b= +"",c=!1,d=function(b){(b=e+1n&&(n+=12,s--);if(u)for(var v=this._daylightSavingAdjust(new Date(u.getFullYear(),u.getMonth()-p[0]*p[1]+1,u.getDate())),v=r&&vv;)n--,0>n&&(n=11,s--);a.drawMonth=n;a.drawYear=s;var v=this._get(a,"prevText"),v=!m?v:this.formatDate(v,this._daylightSavingAdjust(new Date(s,n-q,1)),this._getFormatConfig(a)), +v=this._canAdjustMonth(a,-1,s,n)?''+v+"":g?"":''+v+"",z=this._get(a,"nextText"),z=!m?z:this.formatDate(z,this._daylightSavingAdjust(new Date(s, +n+q,1)),this._getFormatConfig(a)),g=this._canAdjustMonth(a,1,s,n)?''+z+"":g?"":''+z+"",q=this._get(a,"currentText"),z=this._get(a,"gotoCurrent")&& +a.currentDay?w:c,q=!m?q:this.formatDate(q,z,this._getFormatConfig(a)),m=!a.inline?'":"",e=e?'
    '+(d?m:"")+(this._isInRange(a,z)?'":"")+(d?"":m)+"
    ":"",m=parseInt(this._get(a,"firstDay"),10),m=isNaN(m)?0:m,q=this._get(a,"showWeek"),z=this._get(a,"dayNames");this._get(a,"dayNamesShort");var B=this._get(a,"dayNamesMin"),E=this._get(a,"monthNames"),C=this._get(a,"monthNamesShort"),O=this._get(a,"beforeShowDay"),K=this._get(a,"showOtherMonths"),S=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var P=this._getDefaultDate(a),G="",H=0;H'+(/all|left/.test(A)&& +0==H?d?g:v:"")+(/all|right/.test(A)&&0==H?d?v:g:"")+this._generateMonthYearHeader(a,n,s,r,u,0
    '),D=q?'":"",A=0;7>A;A++)var x=(A+m)%7,D=D+("'+B[x]+"");y+=D+"";D=this._getDaysInMonth(s,n);s==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay, +D));A=(this._getFirstDayOfMonth(s,n)-m+7)%7;D=Math.ceil((A+D)/7);this.maxRows=D=o?this.maxRows>D?this.maxRows:D:D;for(var x=this._daylightSavingAdjust(new Date(s,n,1-A)),R=0;R",M=!q?"":'",A=0;7>A;A++){var J=O?O.apply(a.input?a.input[0]:null,[x]):[!0,""],F=x.getMonth()!=n,N=F&&!S||!J[0]||r&&xu,M=M+('");x.setDate(x.getDate()+1);x=this._daylightSavingAdjust(x)}y+=M+""}n++;11
    '+this._get(a,"weekHeader")+"
    '+this._get(a,"calculateWeek")(x)+""+(F&&!K? +" ":N?''+x.getDate()+"":''+x.getDate()+"")+"
    "+(o?""+(0':""):"");L+=y}G+=L}G+=e+(b.browser.msie&& +7>parseInt(b.browser.version,10)&&!a.inline?'':"");a._keyEvent=!1;return G},_generateMonthYearHeader:function(a,b,c,d,e,g,p,n){var q=this._get(a,"changeMonth"),o=this._get(a,"changeYear"),w=this._get(a,"showMonthAfterYear"),r='
    ',u="";if(g||!q)u+=''+p[b]+"";else{for(var p=d&&d.getFullYear()==c,s=e&&e.getFullYear()==c,u=u+('"}w||(r+=u+(g||!q||!o?" ":""));if(!a.yearshtml)if(a.yearshtml="",g||!o)r+=''+c+"";else{var n=this._get(a,"yearRange").split(":"),z=(new Date).getFullYear(),p=function(a){a= +a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?z+parseInt(a,10):parseInt(a,10);return isNaN(a)?z:a},b=p(n[0]),n=Math.max(b,p(n[1]||"")),b=d?Math.max(b,d.getFullYear()):b,n=e?Math.min(n,e.getFullYear()):n;for(a.yearshtml+='";r+=a.yearshtml;a.yearshtml=null}r+=this._get(a,"yearSuffix");w&&(r+=(g||!q||!o?" ":"")+u);return r+"
    "},_adjustInstDate:function(a,b,c){var d=a.drawYear+("Y"==c?b:0),e=a.drawMonth+("M"==c?b:0),b=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+("D"==c?b:0),d=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,b)));a.selectedDay=d.getDate();a.drawMonth=a.selectedMonth=d.getMonth();a.drawYear=a.selectedYear=d.getFullYear();("M"==c|| +"Y"==c)&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),c=c&&bd?d:c},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return null==a?[1,1]:"number"==typeof a?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a, +b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),c=this._daylightSavingAdjust(new Date(c,d+(0>b?b:e[0]*e[1]),1));0>b&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<= +d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff"),b="string"!=typeof b?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);b=b?"object"==typeof b?b:this._daylightSavingAdjust(new Date(d, +c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});b.fn.datepicker=function(a){if(!this.length)return this;b.datepicker.initialized||(b(document).mousedown(b.datepicker._checkExternalClick).find("body").append(b.datepicker.dpDiv),b.datepicker.initialized=!0);var c=Array.prototype.slice.call(arguments,1);return"string"==typeof a&&("isDisabled"==a||"getDate"==a||"widget"==a)||"option"== +a&&2==arguments.length&&"string"==typeof arguments[1]?b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,[this[0]].concat(c)):this.each(function(){typeof a=="string"?b.datepicker["_"+a+"Datepicker"].apply(b.datepicker,[this].concat(c)):b.datepicker._attachDatepicker(this,a)})};b.datepicker=new c;b.datepicker.initialized=!1;b.datepicker.uuid=(new Date).getTime();b.datepicker.version="1.8.14";window["DP_jQuery_"+h]=b})(jQuery); +(function(b,a){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("
    ").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); +this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(b){if(b===a)return this._value();this._setOption("value",b);return this},_setOption:function(a,d){"value"===a&&(this.options.value=d,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete"));b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;"number"!==typeof a&&(a=0);return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* +this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change"));this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.14"})})(jQuery); +jQuery.effects||function(b,a){function c(a){var c;return a&&a.constructor==Array&&3==a.length?a:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(a))?[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)]:(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(a))?[2.55*parseFloat(c[1]),2.55*parseFloat(c[2]),2.55*parseFloat(c[3])]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a))?[parseInt(c[1],16),parseInt(c[2], +16),parseInt(c[3],16)]:(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(a))?[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)]:/rgba\(0, 0, 0, 0\)/.exec(a)?i.transparent:i[b.trim(a).toLowerCase()]}function d(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]])for(var e=a.length;e--;)c=a[e],"string"==typeof a[c]&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c]);else for(c in a)"string"=== +typeof a[c]&&(b[c]=a[c]);return b}function g(a){var c,d;for(c in a)d=a[c],(null==d||b.isFunction(d)||c in k||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete a[c];return a}function h(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function e(a,c,d,e){"object"==typeof a&&(e=c,d=null,c=a,a=c.effect);b.isFunction(c)&&(e=c,d=null,c={});if("number"==typeof c||b.fx.speeds[c])e=d,d=c,c={};b.isFunction(d)&&(e=d,d=null);c=c||{};d=d||c.duration;d=b.fx.off?0:"number"==typeof d? +d:d in b.fx.speeds?b.fx.speeds[d]:b.fx.speeds._default;e=e||c.complete;return[a,c,d,e]}function f(a){return!a||("number"===typeof a||b.fx.speeds[a])||"string"===typeof a&&!b.effects[a]?!0:!1}b.effects={};b.each("backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor borderColor color outlineColor".split(" "),function(a,d){b.fx.step[d]=function(a){if(!a.colorInit){var e;e=a.elem;var f=d,g;do{g=b.curCSS(e,f);if(g!=""&&g!="transparent"||b.nodeName(e,"body"))break;f="backgroundColor"}while(e= +e.parentNode);e=c(g);a.start=e;a.end=c(a.end);a.colorInit=true}a.elem.style[d]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var i={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139], +darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255], +maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},j=["add","remove","toggle"],k={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};b.effects.animateClass=function(a,c,e,f){b.isFunction(e)&&(f=e,e=null);return this.queue(function(){var i=b(this),o=i.attr("style")|| +" ",k=g(d.call(this)),r,u=i.attr("class");b.each(j,function(b,c){if(a[c])i[c+"Class"](a[c])});r=g(d.call(this));i.attr("class",u);i.animate(h(k,r),{queue:false,duration:c,easing:e,complete:function(){b.each(j,function(b,c){if(a[c])i[c+"Class"](a[c])});if(typeof i.attr("style")=="object"){i.attr("style").cssText="";i.attr("style").cssText=o}else i.attr("style",o);f&&f.apply(this,arguments);b.dequeue(this)}})})};b.fn.extend({_addClass:b.fn.addClass,addClass:function(a,c,d,e){return c?b.effects.animateClass.apply(this, +[{add:a},c,d,e]):this._addClass(a)},_removeClass:b.fn.removeClass,removeClass:function(a,c,d,e){return c?b.effects.animateClass.apply(this,[{remove:a},c,d,e]):this._removeClass(a)},_toggleClass:b.fn.toggleClass,toggleClass:function(c,d,e,f,g){return"boolean"==typeof d||d===a?e?b.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):b.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(a,c,d,e,f){return b.effects.animateClass.apply(this,[{add:c, +remove:a},d,e,f])}});b.extend(b.effects,{version:"1.8.14",save:function(a,b){for(var c=0;c").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});a.wrap(d);d=a.parent();"static"==a.css("position")?(d.css({position:"relative"}),a.css({position:"relative"})): +(b.extend(c,{position:a.css("position"),zIndex:a.css("z-index")}),b.each(["top","left","bottom","right"],function(b,d){c[d]=a.css(d);isNaN(parseInt(c[d],10))&&(c[d]="auto")}),a.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"}));return d.css(c).show()},removeWrapper:function(a){return a.parent().is(".ui-effects-wrapper")?a.parent().replaceWith(a):a},setTransition:function(a,c,d,e){e=e||{};b.each(c,function(b,c){unit=a.cssUnit(c);0(b/=e/2)?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){return 1>(b/=e/2)?d/2*b*b*b+c:d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c}, +easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){return 1>(b/=e/2)?d/2*b*b*b*b+c:-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){return 1>(b/=e/2)?d/2*b*b*b*b*b+c:d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/ +e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return 0==b?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){return 0==b?c:b==e?c+d:1>(b/=e/2)?d/2*Math.pow(2,10*(b-1))+c:d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)* +b)+c},easeInOutCirc:function(a,b,c,d,e){return 1>(b/=e/2)?-d/2*(Math.sqrt(1-b*b)-1)+c:d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var a=1.70158,f=0,g=d;if(0==b)return c;if(1==(b/=e))return c+d;f||(f=0.3*e);gb?-0.5*g*Math.pow(2,10*(b-=1))*Math.sin((b*e-a)*2*Math.PI/f)+c:0.5*g*Math.pow(2,-10*(b-=1))*Math.sin((b*e-a)*2*Math.PI/f)+d+c},easeInBack:function(b,c,d,e,f,g){g==a&&(g=1.70158);return e*(c/=f)*c*((g+1)*c-g)+d},easeOutBack:function(b,c,d,e, +f,g){g==a&&(g=1.70158);return e*((c=c/f-1)*c*((g+1)*c+g)+1)+d},easeInOutBack:function(b,c,d,e,f,g){g==a&&(g=1.70158);return 1>(c/=f/2)?e/2*c*c*(((g*=1.525)+1)*c-g)+d:e/2*((c-=2)*c*(((g*=1.525)+1)*c+g)+2)+d},easeInBounce:function(a,c,d,e,f){return e-b.easing.easeOutBounce(a,f-c,0,e,f)+d},easeOutBounce:function(a,b,c,d,e){return(b/=e)<1/2.75?d*7.5625*b*b+c:b<2/2.75?d*(7.5625*(b-=1.5/2.75)*b+0.75)+c:b<2.5/2.75?d*(7.5625*(b-=2.25/2.75)*b+0.9375)+c:d*(7.5625*(b-=2.625/2.75)*b+0.984375)+c},easeInOutBounce:function(a, +c,d,e,f){return c").css({position:"absolute",visibility:"visible",left:-j*(e/d),top:-i*(f/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:e/d,height:f/c,left:h.left+j*(e/d)+("show"==a.options.mode?(j-Math.floor(d/2))*(e/d):0),top:h.top+i*(f/c)+("show"==a.options.mode?(i-Math.floor(c/2))*(f/c):0),opacity:"show"==a.options.mode?0:1}).animate({left:h.left+j*(e/d)+("show"==a.options.mode?0:(j-Math.floor(d/2))*(e/d)),top:h.top+ +i*(f/c)+("show"==a.options.mode?0:(i-Math.floor(c/2))*(f/c)),opacity:"show"==a.options.mode?1:0},a.duration||500);setTimeout(function(){"show"==a.options.mode?g.css({visibility:"visible"}):g.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(g[0]);g.dequeue();b("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); +(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); +(function(b){b.effects.fold=function(a){return this.queue(function(){var c=b(this),d=["position","top","bottom","left","right"],g=b.effects.setMode(c,a.options.mode||"hide"),h=a.options.size||15,e=!!a.options.horizFirst,f=a.duration?a.duration/2:b.fx.speeds._default/2;b.effects.save(c,d);c.show();var i=b.effects.createWrapper(c).css({overflow:"hidden"}),j="show"==g!=e,k=j?["width","height"]:["height","width"],j=j?[i.width(),i.height()]:[i.height(),i.width()],l=/([0-9]+)%/.exec(h);l&&(h=parseInt(l[1], +10)/100*j["hide"==g?0:1]);"show"==g&&i.css(e?{height:0,width:h}:{height:h,width:0});e={};l={};e[k[0]]="show"==g?j[0]:h;l[k[1]]="show"==g?j[1]:0;i.animate(e,f,a.options.easing).animate(l,f,a.options.easing,function(){"hide"==g&&c.hide();b.effects.restore(c,d);b.effects.removeWrapper(c);a.callback&&a.callback.apply(c[0],arguments);c.dequeue()})})}})(jQuery); +(function(b){b.effects.highlight=function(a){return this.queue(function(){var c=b(this),d=["backgroundImage","backgroundColor","opacity"],g=b.effects.setMode(c,a.options.mode||"show"),h={backgroundColor:c.css("backgroundColor")};"hide"==g&&(h.opacity=0);b.effects.save(c,d);c.show().css({backgroundImage:"none",backgroundColor:a.options.color||"#ffff99"}).animate(h,{queue:!1,duration:a.duration,easing:a.options.easing,complete:function(){g=="hide"&&c.hide();b.effects.restore(c,d);g=="show"&&!b.support.opacity&& +this.style.removeAttribute("filter");a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); +(function(b){b.effects.pulsate=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"show");times=2*(a.options.times||5)-1;duration=a.duration?a.duration/2:b.fx.speeds._default/2;isVisible=c.is(":visible");animateTo=0;isVisible||(c.css("opacity",0).show(),animateTo=1);("hide"==d&&isVisible||"show"==d&&!isVisible)&×--;for(d=0;d').appendTo(document.body).addClass(a.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(d,a.duration,a.options.easing,function(){h.remove();a.callback&&a.callback.apply(c[0],arguments);c.dequeue()})})}})(jQuery); +/* + * jQuery Highlight plugin + * Based on highlight v3 by Johann Burkard + * http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html + * Copyright (c) 2009 Bartek Szopka http://bartaz.github.com/sandbox.js/jquery.highlight.html + * Licensed under MIT license. + */ +jQuery.extend({highlight:function(a,c,b,e){if(a.nodeType===3){if(c=a.data.match(c)){b=document.createElement(b||"span");b.className=e||"highlight";a=a.splitText(c.index);a.splitText(c[0].length);e=a.cloneNode(true);b.appendChild(e);a.parentNode.replaceChild(b,a);return 1}}else if(a.nodeType===1&&a.childNodes&&!/(script|style)/i.test(a.tagName)&&!(a.tagName===b.toUpperCase()&&a.className===e))for(var d=0;d').appendTo("body"); + var d = { width: $c.width() - $c[0].clientWidth, height: $c.height() - $c[0].clientHeight }; + $c.remove(); + window.scrollbarWidth = d.width; + window.scrollbarHeight = d.height; + return dim.match(/^(width|height)$/) ? d[dim] : d; + } + + + /** + * Returns hash container 'display' and 'visibility' + * + * @see $.swap() - swaps CSS, runs callback, resets CSS + */ +, showInvisibly: function ($E, force) { + if (!$E) return {}; + if (!$E.jquery) $E = $($E); + var CSS = { + display: $E.css('display') + , visibility: $E.css('visibility') + }; + if (force || CSS.display === "none") { // only if not *already hidden* + $E.css({ display: "block", visibility: "hidden" }); // show element 'invisibly' so can be measured + return CSS; + } + else return {}; + } + + /** + * Returns data for setting size of an element (container or a pane). + * + * @see _create(), onWindowResize() for container, plus others for pane + * @return JSON Returns a hash of all dimensions: top, bottom, left, right, outerWidth, innerHeight, etc + */ +, getElementDimensions: function ($E) { + var + d = {} // dimensions hash + , x = d.css = {} // CSS hash + , i = {} // TEMP insets + , b, p // TEMP border, padding + , N = $.layout.cssNum + , off = $E.offset() + ; + d.offsetLeft = off.left; + d.offsetTop = off.top; + + $.each("Left,Right,Top,Bottom".split(","), function (idx, e) { // e = edge + b = x["border" + e] = $.layout.borderWidth($E, e); + p = x["padding"+ e] = $.layout.cssNum($E, "padding"+e); + i[e] = b + p; // total offset of content from outer side + d["inset"+ e] = p; + }); + + d.offsetWidth = $E.innerWidth(); // offsetWidth is used in calc when doing manual resize + d.offsetHeight = $E.innerHeight(); // ditto + d.outerWidth = $E.outerWidth(); + d.outerHeight = $E.outerHeight(); + d.innerWidth = max(0, d.outerWidth - i.Left - i.Right); + d.innerHeight = max(0, d.outerHeight - i.Top - i.Bottom); + + x.width = $E.width(); + x.height = $E.height(); + x.top = N($E,"top",true); + x.bottom = N($E,"bottom",true); + x.left = N($E,"left",true); + x.right = N($E,"right",true); + + //d.visible = $E.is(":visible");// && x.width > 0 && x.height > 0; + + return d; + } + +, getElementCSS: function ($E, list) { + var + CSS = {} + , style = $E[0].style + , props = list.split(",") + , sides = "Top,Bottom,Left,Right".split(",") + , attrs = "Color,Style,Width".split(",") + , p, s, a, i, j, k + ; + for (i=0; i < props.length; i++) { + p = props[i]; + if (p.match(/(border|padding|margin)$/)) + for (j=0; j < 4; j++) { + s = sides[j]; + if (p === "border") + for (k=0; k < 3; k++) { + a = attrs[k]; + CSS[p+s+a] = style[p+s+a]; + } + else + CSS[p+s] = style[p+s]; + } + else + CSS[p] = style[p]; + }; + return CSS + } + + /** + * Return the innerWidth for the current browser/doctype + * + * @see initPanes(), sizeMidPanes(), initHandles(), sizeHandles() + * @param {Array.} $E Must pass a jQuery object - first element is processed + * @param {number=} outerWidth (optional) Can pass a width, allowing calculations BEFORE element is resized + * @return {number} Returns the innerWidth of the elem by subtracting padding and borders + */ +, cssWidth: function ($E, outerWidth) { + var + b = $.layout.borderWidth + , n = $.layout.cssNum + ; + // a 'calculated' outerHeight can be passed so borders and/or padding are removed if needed + if (outerWidth <= 0) return 0; + + if (!$.support.boxModel) return outerWidth; + + // strip border and padding from outerWidth to get CSS Width + var W = outerWidth + - b($E, "Left") + - b($E, "Right") + - n($E, "paddingLeft") + - n($E, "paddingRight") + ; + + return max(0,W); + } + + /** + * Return the innerHeight for the current browser/doctype + * + * @see initPanes(), sizeMidPanes(), initHandles(), sizeHandles() + * @param {Array.} $E Must pass a jQuery object - first element is processed + * @param {number=} outerHeight (optional) Can pass a width, allowing calculations BEFORE element is resized + * @return {number} Returns the innerHeight of the elem by subtracting padding and borders + */ +, cssHeight: function ($E, outerHeight) { + var + b = $.layout.borderWidth + , n = $.layout.cssNum + ; + // a 'calculated' outerHeight can be passed so borders and/or padding are removed if needed + if (outerHeight <= 0) return 0; + + if (!$.support.boxModel) return outerHeight; + + // strip border and padding from outerHeight to get CSS Height + var H = outerHeight + - b($E, "Top") + - b($E, "Bottom") + - n($E, "paddingTop") + - n($E, "paddingBottom") + ; + + return max(0,H); + } + + /** + * Returns the 'current CSS numeric value' for a CSS property - 0 if property does not exist + * + * @see Called by many methods + * @param {Array.} $E Must pass a jQuery object - first element is processed + * @param {string} prop The name of the CSS property, eg: top, width, etc. + * @param {boolean=} [allowAuto=false] true = return 'auto' if that is value; false = return 0 + * @return {(string|number)} Usually used to get an integer value for position (top, left) or size (height, width) + */ +, cssNum: function ($E, prop, allowAuto) { + if (!$E.jquery) $E = $($E); + var CSS = $.layout.showInvisibly($E) + , p = $.curCSS($E[0], prop, true) + , v = allowAuto && p=="auto" ? p : (parseInt(p, 10) || 0); + $E.css( CSS ); // RESET + return v; + } + +, borderWidth: function (el, side) { + if (el.jquery) el = el[0]; + var b = "border"+ side.substr(0,1).toUpperCase() + side.substr(1); // left => Left + return $.curCSS(el, b+"Style", true) === "none" ? 0 : (parseInt($.curCSS(el, b+"Width", true), 10) || 0); + } + + /** + * Mouse-tracking utility - FUTURE REFERENCE + * + * init: if (!window.mouse) { + * window.mouse = { x: 0, y: 0 }; + * $(document).mousemove( $.layout.trackMouse ); + * } + * + * @param {Object} evt + * +, trackMouse: function (evt) { + window.mouse = { x: evt.clientX, y: evt.clientY }; + } + */ + + /** + * SUBROUTINE for preventPrematureSlideClose option + * + * @param {Object} evt + * @param {Object=} el + */ +, isMouseOverElem: function (evt, el) { + var + $E = $(el || this) + , d = $E.offset() + , T = d.top + , L = d.left + , R = L + $E.outerWidth() + , B = T + $E.outerHeight() + , x = evt.pageX // evt.clientX ? + , y = evt.pageY // evt.clientY ? + ; + // if X & Y are < 0, probably means is over an open SELECT + return ($.layout.browser.msie && x < 0 && y < 0) || ((x >= L && x <= R) && (y >= T && y <= B)); + } + + /** + * Message/Logging Utility + * + * @example $.layout.msg("My message"); // log text + * @example $.layout.msg("My message", true); // alert text + * @example $.layout.msg({ foo: "bar" }, "Title"); // log hash-data, with custom title + * @example $.layout.msg({ foo: "bar" }, true, "Title", { sort: false }); -OR- + * @example $.layout.msg({ foo: "bar" }, "Title", { sort: false, display: true }); // alert hash-data + * + * @param {(Object|string)} info String message OR Hash/Array + * @param {(Boolean|string|Object)=} [popup=false] True means alert-box - can be skipped + * @param {(Object|string)=} [debugTitle=""] Title for Hash data - can be skipped + * @param {Object=} [debutOpts={}] Extra options for debug output + */ +, msg: function (info, popup, debugTitle, debugOpts) { + if ($.isPlainObject(info) && window.debugData) { + if (typeof popup === "string") { + debugOpts = debugTitle; + debugTitle = popup; + } + else if (typeof debugTitle === "object") { + debugOpts = debugTitle; + debugTitle = null; + } + var t = debugTitle || "log( )" + , o = $.extend({ sort: false, returnHTML: false, display: false }, debugOpts); + if (popup === true || o.display) + debugData( info, t, o ); + else if (window.console) + console.log(debugData( info, t, o )); + } + else if (popup) + alert(info); + else if (window.console) + console.log(info); + else { + var id = "#layoutLogger" + , $l = $(id); + if (!$l.length) + $l = createLog(); + $l.children("ul").append('
  • '+ info.replace(/\/g,">") +'
  • '); + } + + function createLog () { + var pos = $.support.fixedPosition ? 'fixed' : 'absolute' + , $e = $('
    ' + + '
    ' + + 'XLayout console.log
    ' + + '
      ' + + '
      ' + ).appendTo("body"); + $e.css('left', $(window).width() - $e.outerWidth() - 5) + if ($.ui.draggable) $e.draggable({ handle: ':first-child' }); + return $e; + }; + } + +}; + +var lang = $.layout.language; // alias used in defaults... + +// DEFAULT OPTIONS - CHANGE IF DESIRED +$.layout.defaults = { +/* + * LAYOUT & LAYOUT-CONTAINER OPTIONS + * - none of these options are applicable to individual panes + */ + name: "" // Not required, but useful for buttons and used for the state-cookie +, containerSelector: "" // ONLY used when specifying a childOptions - to find container-element that is NOT directly-nested +, containerClass: "ui-layout-container" // layout-container element +, scrollToBookmarkOnLoad: true // after creating a layout, scroll to bookmark in URL (.../page.htm#myBookmark) +, resizeWithWindow: true // bind thisLayout.resizeAll() to the window.resize event +, resizeWithWindowDelay: 200 // delay calling resizeAll because makes window resizing very jerky +, resizeWithWindowMaxDelay: 0 // 0 = none - force resize every XX ms while window is being resized +, onresizeall_start: null // CALLBACK when resizeAll() STARTS - NOT pane-specific +, onresizeall_end: null // CALLBACK when resizeAll() ENDS - NOT pane-specific +, onload_start: null // CALLBACK when Layout inits - after options initialized, but before elements +, onload_end: null // CALLBACK when Layout inits - after EVERYTHING has been initialized +, onunload_start: null // CALLBACK when Layout is destroyed OR onWindowUnload +, onunload_end: null // CALLBACK when Layout is destroyed OR onWindowUnload +, autoBindCustomButtons: false // search for buttons with ui-layout-button class and auto-bind them +, initPanes: true // false = DO NOT initialize the panes onLoad - will init later +, showErrorMessages: true // enables fatal error messages to warn developers of common errors +, showDebugMessages: false // display console-and-alert debug msgs - IF this Layout version _has_ debugging code! +// Changing this zIndex value will cause other zIndex values to automatically change +, zIndex: null // the PANE zIndex - resizers and masks will be +1 +// DO NOT CHANGE the zIndex values below unless you clearly understand their relationships +, zIndexes: { // set _default_ z-index values here... + pane_normal: 0 // normal z-index for panes + , content_mask: 1 // applied to overlays used to mask content INSIDE panes during resizing + , resizer_normal: 2 // normal z-index for resizer-bars + , pane_sliding: 100 // applied to *BOTH* the pane and its resizer when a pane is 'slid open' + , pane_animate: 1000 // applied to the pane when being animated - not applied to the resizer + , resizer_drag: 10000 // applied to the CLONED resizer-bar when being 'dragged' + } +/* + * PANE DEFAULT SETTINGS + * - settings under the 'panes' key become the default settings for *all panes* + * - ALL pane-options can also be set specifically for each panes, which will override these 'default values' + */ +, panes: { // default options for 'all panes' - will be overridden by 'per-pane settings' + applyDemoStyles: false // NOTE: renamed from applyDefaultStyles for clarity + , closable: true // pane can open & close + , resizable: true // when open, pane can be resized + , slidable: true // when closed, pane can 'slide open' over other panes - closes on mouse-out + , initClosed: false // true = init pane as 'closed' + , initHidden: false // true = init pane as 'hidden' - no resizer-bar/spacing + // SELECTORS + //, paneSelector: "" // MUST be pane-specific - jQuery selector for pane + , contentSelector: ".ui-layout-content" // INNER div/element to auto-size so only it scrolls, not the entire pane! + , contentIgnoreSelector: ".ui-layout-ignore" // element(s) to 'ignore' when measuring 'content' + , findNestedContent: false // true = $P.find(contentSelector), false = $P.children(contentSelector) + // GENERIC ROOT-CLASSES - for auto-generated classNames + , paneClass: "ui-layout-pane" // Layout Pane + , resizerClass: "ui-layout-resizer" // Resizer Bar + , togglerClass: "ui-layout-toggler" // Toggler Button + , buttonClass: "ui-layout-button" // CUSTOM Buttons - eg: '[ui-layout-button]-toggle/-open/-close/-pin' + // ELEMENT SIZE & SPACING + //, size: 100 // MUST be pane-specific -initial size of pane + , minSize: 0 // when manually resizing a pane + , maxSize: 0 // ditto, 0 = no limit + , spacing_open: 6 // space between pane and adjacent panes - when pane is 'open' + , spacing_closed: 6 // ditto - when pane is 'closed' + , togglerLength_open: 50 // Length = WIDTH of toggler button on north/south sides - HEIGHT on east/west sides + , togglerLength_closed: 50 // 100% OR -1 means 'full height/width of resizer bar' - 0 means 'hidden' + , togglerAlign_open: "center" // top/left, bottom/right, center, OR... + , togglerAlign_closed: "center" // 1 => nn = offset from top/left, -1 => -nn == offset from bottom/right + , togglerTip_open: lang.Close // Toggler tool-tip (title) + , togglerTip_closed: lang.Open // ditto + , togglerContent_open: "" // text or HTML to put INSIDE the toggler + , togglerContent_closed: "" // ditto + // RESIZING OPTIONS + , resizerDblClickToggle: true // + , autoResize: true // IF size is 'auto' or a percentage, then recalc 'pixel size' whenever the layout resizes + , autoReopen: true // IF a pane was auto-closed due to noRoom, reopen it when there is room? False = leave it closed + , resizerDragOpacity: 1 // option for ui.draggable + //, resizerCursor: "" // MUST be pane-specific - cursor when over resizer-bar + , maskContents: false // true = add DIV-mask over-or-inside this pane so can 'drag' over IFRAMES + , maskObjects: false // true = add IFRAME-mask over-or-inside this pane to cover objects/applets - content-mask will overlay this mask + , maskZindex: null // will override zIndexes.content_mask if specified - not applicable to iframe-panes + , resizingGrid: false // grid size that the resizers will snap-to during resizing, eg: [20,20] + , livePaneResizing: false // true = LIVE Resizing as resizer is dragged + , liveContentResizing: false // true = re-measure header/footer heights as resizer is dragged + , liveResizingTolerance: 1 // how many px change before pane resizes, to control performance + // TIPS & MESSAGES - also see lang object + , noRoomToOpenTip: lang.noRoomToOpenTip + , resizerTip: lang.Resize // Resizer tool-tip (title) + , sliderTip: lang.Slide // resizer-bar triggers 'sliding' when pane is closed + , sliderCursor: "pointer" // cursor when resizer-bar will trigger 'sliding' + , slideTrigger_open: "click" // click, dblclick, mouseenter + , slideTrigger_close: "mouseleave"// click, mouseleave + , slideDelay_open: 300 // applies only for mouseenter event - 0 = instant open + , slideDelay_close: 300 // applies only for mouseleave event (300ms is the minimum!) + , hideTogglerOnSlide: false // when pane is slid-open, should the toggler show? + , preventQuickSlideClose: $.layout.browser.webkit // Chrome triggers slideClosed as it is opening + , preventPrematureSlideClose: false // handle incorrect mouseleave trigger, like when over a SELECT-list in IE + // HOT-KEYS & MISC + , showOverflowOnHover: false // will bind allowOverflow() utility to pane.onMouseOver + , enableCursorHotkey: true // enabled 'cursor' hotkeys + //, customHotkey: "" // MUST be pane-specific - EITHER a charCode OR a character + , customHotkeyModifier: "SHIFT" // either 'SHIFT', 'CTRL' or 'CTRL+SHIFT' - NOT 'ALT' + // PANE ANIMATION + // NOTE: fxSss_open, fxSss_close & fxSss_size options (eg: fxName_open) are auto-generated if not passed + , fxName: "slide" // ('none' or blank), slide, drop, scale -- only relevant to 'open' & 'close', NOT 'size' + , fxSpeed: null // slow, normal, fast, 200, nnn - if passed, will OVERRIDE fxSettings.duration + , fxSettings: {} // can be passed, eg: { easing: "easeOutBounce", duration: 1500 } + , fxOpacityFix: true // tries to fix opacity in IE to restore anti-aliasing after animation + , animatePaneSizing: false // true = animate resizing after dragging resizer-bar OR sizePane() is called + /* NOTE: Action-specific FX options are auto-generated from the options above if not specifically set: + fxName_open: "slide" // 'Open' pane animation + fnName_close: "slide" // 'Close' pane animation + fxName_size: "slide" // 'Size' pane animation - when animatePaneSizing = true + fxSpeed_open: null + fxSpeed_close: null + fxSpeed_size: null + fxSettings_open: {} + fxSettings_close: {} + fxSettings_size: {} + */ + // CHILD/NESTED LAYOUTS + , childOptions: null // Layout-options for nested/child layout - even {} is valid as options + , initChildLayout: true // true = child layout will be created as soon as _this_ layout completes initialization + , destroyChildLayout: true // true = destroy child-layout if this pane is destroyed + , resizeChildLayout: true // true = trigger child-layout.resizeAll() when this pane is resized + // PANE CALLBACKS + , triggerEventsOnLoad: false // true = trigger onopen OR onclose callbacks when layout initializes + , triggerEventsDuringLiveResize: true // true = trigger onresize callback REPEATEDLY if livePaneResizing==true + , onshow_start: null // CALLBACK when pane STARTS to Show - BEFORE onopen/onhide_start + , onshow_end: null // CALLBACK when pane ENDS being Shown - AFTER onopen/onhide_end + , onhide_start: null // CALLBACK when pane STARTS to Close - BEFORE onclose_start + , onhide_end: null // CALLBACK when pane ENDS being Closed - AFTER onclose_end + , onopen_start: null // CALLBACK when pane STARTS to Open + , onopen_end: null // CALLBACK when pane ENDS being Opened + , onclose_start: null // CALLBACK when pane STARTS to Close + , onclose_end: null // CALLBACK when pane ENDS being Closed + , onresize_start: null // CALLBACK when pane STARTS being Resized ***FOR ANY REASON*** + , onresize_end: null // CALLBACK when pane ENDS being Resized ***FOR ANY REASON*** + , onsizecontent_start: null // CALLBACK when sizing of content-element STARTS + , onsizecontent_end: null // CALLBACK when sizing of content-element ENDS + , onswap_start: null // CALLBACK when pane STARTS to Swap + , onswap_end: null // CALLBACK when pane ENDS being Swapped + , ondrag_start: null // CALLBACK when pane STARTS being ***MANUALLY*** Resized + , ondrag_end: null // CALLBACK when pane ENDS being ***MANUALLY*** Resized + } +/* + * PANE-SPECIFIC SETTINGS + * - options listed below MUST be specified per-pane - they CANNOT be set under 'panes' + * - all options under the 'panes' key can also be set specifically for any pane + * - most options under the 'panes' key apply only to 'border-panes' - NOT the the center-pane + */ +, north: { + paneSelector: ".ui-layout-north" + , size: "auto" // eg: "auto", "30%", .30, 200 + , resizerCursor: "n-resize" // custom = url(myCursor.cur) + , customHotkey: "" // EITHER a charCode (43) OR a character ("o") + } +, south: { + paneSelector: ".ui-layout-south" + , size: "auto" + , resizerCursor: "s-resize" + , customHotkey: "" + } +, east: { + paneSelector: ".ui-layout-east" + , size: 200 + , resizerCursor: "e-resize" + , customHotkey: "" + } +, west: { + paneSelector: ".ui-layout-west" + , size: 200 + , resizerCursor: "w-resize" + , customHotkey: "" + } +, center: { + paneSelector: ".ui-layout-center" + , minWidth: 0 + , minHeight: 0 + } +}; + +$.layout.optionsMap = { + // layout/global options - NOT pane-options + layout: ("stateManagement,effects,zIndexes," + + "name,zIndex,scrollToBookmarkOnLoad,showErrorMessages," + + "resizeWithWindow,resizeWithWindowDelay,resizeWithWindowMaxDelay," + + "onresizeall,onresizeall_start,onresizeall_end,onload,onunload,autoBindCustomButtons").split(",") +// borderPanes: [ ALL options that are NOT specified as 'layout' ] + // default.panes options that apply to the center-pane (most options apply _only_ to border-panes) +, center: ("paneClass,contentSelector,contentIgnoreSelector,findNestedContent,applyDemoStyles,triggerEventsOnLoad," + + "showOverflowOnHover,maskContents,maskObjects,liveContentResizing," + + "childOptions,initChildLayout,resizeChildLayout,destroyChildLayout," + + "onresize,onresize_start,onresize_end,onsizecontent,onsizecontent_start,onsizecontent_end").split(",") + // options that MUST be specifically set 'per-pane' - CANNOT set in the panes (defaults) key +, noDefault: ("paneSelector,resizerCursor,customHotkey").split(",") +}; + +/** + * Processes options passed in converts flat-format data into subkey (JSON) format + * In flat-format, subkeys are _currently_ separated with 2 underscores, like north__optName + * Plugins may also call this method so they can transform their own data + * + * @param {!Object} hash Data/options passed by user - may be a single level or nested levels + * @return {Object} Returns hash of minWidth & minHeight + */ +$.layout.transformData = function (hash) { + var json = { panes: {}, center: {} } // init return object + , data, branch, optKey, keys, key, val, i, c; + + if (typeof hash !== "object") return json; // no options passed + + // convert all 'flat-keys' to 'sub-key' format + for (optKey in hash) { + branch = json; + data = $.layout.optionsMap.layout; + val = hash[ optKey ]; + keys = optKey.split("__"); // eg: west__size or north__fxSettings__duration + c = keys.length - 1; + // convert underscore-delimited to subkeys + for (i=0; i <= c; i++) { + key = keys[i]; + if (i === c) + branch[key] = val; + else if (!branch[key]) + branch[key] = {}; // create the subkey + // recurse to sub-key for next loop - if not done + branch = branch[key]; + } + } + + return json; +} + +// INTERNAL CONFIG DATA - DO NOT CHANGE THIS! +$.layout.backwardCompatibility = { + // data used by renameOldOptions() + map: { + // OLD Option Name: NEW Option Name + applyDefaultStyles: "applyDemoStyles" + , resizeNestedLayout: "resizeChildLayout" + , resizeWhileDragging: "livePaneResizing" + , resizeContentWhileDragging: "liveContentResizing" + , triggerEventsWhileDragging: "triggerEventsDuringLiveResize" + , maskIframesOnResize: "maskContents" + , useStateCookie: "stateManagement.enabled" + , "cookie.autoLoad": "stateManagement.autoLoad" + , "cookie.autoSave": "stateManagement.autoSave" + , "cookie.keys": "stateManagement.stateKeys" + , "cookie.name": "stateManagement.cookie.name" + , "cookie.domain": "stateManagement.cookie.domain" + , "cookie.path": "stateManagement.cookie.path" + , "cookie.expires": "stateManagement.cookie.expires" + , "cookie.secure": "stateManagement.cookie.secure" + } + /** + * @param {Object} opts + */ +, renameOptions: function (opts) { + var map = $.layout.backwardCompatibility.map + , oldData, newData, value + ; + for (var itemPath in map) { + oldData = getBranch( itemPath ); + value = oldData.branch[ oldData.key ] + if (value !== undefined) { + newData = getBranch( map[itemPath], true ) + newData.branch[ newData.key ] = value; + delete oldData.branch[ oldData.key ]; + } + } + + /** + * @param {string} path + * @param {boolean=} [create=false] Create path if does not exist + */ + function getBranch (path, create) { + var a = path.split(".") // split keys into array + , c = a.length - 1 + , D = { branch: opts, key: a[c] } // init branch at top & set key (last item) + , i = 0, k, undef; + for (; i 0) { + if (autoHide && $E.data('autoHidden') && $E.innerHeight() > 0) { + $E.show().data('autoHidden', false); + if (!browser.mozilla) // FireFox refreshes iframes - IE does not + // make hidden, then visible to 'refresh' display after animation + $E.css(_c.hidden).css(_c.visible); + } + } + else if (autoHide && !$E.data('autoHidden')) + $E.hide().data('autoHidden', true); + } + + /** + * @param {(string|!Object)} el + * @param {number=} outerHeight + * @param {boolean=} [autoHide=false] + */ +, setOuterHeight = function (el, outerHeight, autoHide) { + var $E = el, h; + if (isStr(el)) $E = $Ps[el]; // west + else if (!el.jquery) $E = $(el); + h = cssH($E, outerHeight); + $E.css({ height: h, visibility: "visible" }); // may have been 'hidden' by sizeContent + if (h > 0 && $E.innerWidth() > 0) { + if (autoHide && $E.data('autoHidden')) { + $E.show().data('autoHidden', false); + if (!browser.mozilla) // FireFox refreshes iframes - IE does not + $E.css(_c.hidden).css(_c.visible); + } + } + else if (autoHide && !$E.data('autoHidden')) + $E.hide().data('autoHidden', true); + } + + /** + * @param {(string|!Object)} el + * @param {number=} outerSize + * @param {boolean=} [autoHide=false] + */ +, setOuterSize = function (el, outerSize, autoHide) { + if (_c[pane].dir=="horz") // pane = north or south + setOuterHeight(el, outerSize, autoHide); + else // pane = east or west + setOuterWidth(el, outerSize, autoHide); + } + + + /** + * Converts any 'size' params to a pixel/integer size, if not already + * If 'auto' or a decimal/percentage is passed as 'size', a pixel-size is calculated + * + /** + * @param {string} pane + * @param {(string|number)=} size + * @param {string=} [dir] + * @return {number} + */ +, _parseSize = function (pane, size, dir) { + if (!dir) dir = _c[pane].dir; + + if (isStr(size) && size.match(/%/)) + size = (size === '100%') ? -1 : parseInt(size, 10) / 100; // convert % to decimal + + if (size === 0) + return 0; + else if (size >= 1) + return parseInt(size, 10); + + var o = options, avail = 0; + if (dir=="horz") // north or south or center.minHeight + avail = sC.innerHeight - ($Ps.north ? o.north.spacing_open : 0) - ($Ps.south ? o.south.spacing_open : 0); + else if (dir=="vert") // east or west or center.minWidth + avail = sC.innerWidth - ($Ps.west ? o.west.spacing_open : 0) - ($Ps.east ? o.east.spacing_open : 0); + + if (size === -1) // -1 == 100% + return avail; + else if (size > 0) // percentage, eg: .25 + return round(avail * size); + else if (pane=="center") + return 0; + else { // size < 0 || size=='auto' || size==Missing || size==Invalid + // auto-size the pane + var dim = (dir === "horz" ? "height" : "width") + , $P = $Ps[pane] + , $C = dim === 'height' ? $Cs[pane] : false + , vis = $.layout.showInvisibly($P) // show pane invisibly if hidden + , szP = $P.css(dim) // SAVE current pane size + , szC = $C ? $C.css(dim) : 0 // SAVE current content size + ; + $P.css(dim, "auto"); + if ($C) $C.css(dim, "auto"); + size = (dim === "height") ? $P.outerHeight() : $P.outerWidth(); // MEASURE + $P.css(dim, szP).css(vis); // RESET size & visibility + if ($C) $C.css(dim, szC); + return size; + } + } + + /** + * Calculates current 'size' (outer-width or outer-height) of a border-pane - optionally with 'pane-spacing' added + * + * @param {(string|!Object)} pane + * @param {boolean=} [inclSpace=false] + * @return {number} Returns EITHER Width for east/west panes OR Height for north/south panes - adjusted for boxModel & browser + */ +, getPaneSize = function (pane, inclSpace) { + var + $P = $Ps[pane] + , o = options[pane] + , s = state[pane] + , oSp = (inclSpace ? o.spacing_open : 0) + , cSp = (inclSpace ? o.spacing_closed : 0) + ; + if (!$P || s.isHidden) + return 0; + else if (s.isClosed || (s.isSliding && inclSpace)) + return cSp; + else if (_c[pane].dir === "horz") + return $P.outerHeight() + oSp; + else // dir === "vert" + return $P.outerWidth() + oSp; + } + + /** + * Calculate min/max pane dimensions and limits for resizing + * + * @param {string} pane + * @param {boolean=} [slide=false] + */ +, setSizeLimits = function (pane, slide) { + if (!isInitialized()) return; + var + o = options[pane] + , s = state[pane] + , c = _c[pane] + , dir = c.dir + , side = c.side.toLowerCase() + , type = c.sizeType.toLowerCase() + , isSliding = (slide != undefined ? slide : s.isSliding) // only open() passes 'slide' param + , $P = $Ps[pane] + , paneSpacing = o.spacing_open + // measure the pane on the *opposite side* from this pane + , altPane = _c.oppositeEdge[pane] + , altS = state[altPane] + , $altP = $Ps[altPane] + , altPaneSize = (!$altP || altS.isVisible===false || altS.isSliding ? 0 : (dir=="horz" ? $altP.outerHeight() : $altP.outerWidth())) + , altPaneSpacing = ((!$altP || altS.isHidden ? 0 : options[altPane][ altS.isClosed !== false ? "spacing_closed" : "spacing_open" ]) || 0) + // limitSize prevents this pane from 'overlapping' opposite pane + , containerSize = (dir=="horz" ? sC.innerHeight : sC.innerWidth) + , minCenterDims = cssMinDims("center") + , minCenterSize = dir=="horz" ? max(options.center.minHeight, minCenterDims.minHeight) : max(options.center.minWidth, minCenterDims.minWidth) + // if pane is 'sliding', then ignore center and alt-pane sizes - because 'overlays' them + , limitSize = (containerSize - paneSpacing - (isSliding ? 0 : (_parseSize("center", minCenterSize, dir) + altPaneSize + altPaneSpacing))) + , minSize = s.minSize = max( _parseSize(pane, o.minSize), cssMinDims(pane).minSize ) + , maxSize = s.maxSize = min( (o.maxSize ? _parseSize(pane, o.maxSize) : 100000), limitSize ) + , r = s.resizerPosition = {} // used to set resizing limits + , top = sC.insetTop + , left = sC.insetLeft + , W = sC.innerWidth + , H = sC.innerHeight + , rW = o.spacing_open // subtract resizer-width to get top/left position for south/east + ; + switch (pane) { + case "north": r.min = top + minSize; + r.max = top + maxSize; + break; + case "west": r.min = left + minSize; + r.max = left + maxSize; + break; + case "south": r.min = top + H - maxSize - rW; + r.max = top + H - minSize - rW; + break; + case "east": r.min = left + W - maxSize - rW; + r.max = left + W - minSize - rW; + break; + }; + } + + /** + * Returns data for setting the size/position of center pane. Also used to set Height for east/west panes + * + * @return JSON Returns a hash of all dimensions: top, bottom, left, right, (outer) width and (outer) height + */ +, calcNewCenterPaneDims = function () { + var d = { + top: getPaneSize("north", true) // true = include 'spacing' value for pane + , bottom: getPaneSize("south", true) + , left: getPaneSize("west", true) + , right: getPaneSize("east", true) + , width: 0 + , height: 0 + }; + + // NOTE: sC = state.container + // calc center-pane outer dimensions + d.width = sC.innerWidth - d.left - d.right; // outerWidth + d.height = sC.innerHeight - d.bottom - d.top; // outerHeight + // add the 'container border/padding' to get final positions relative to the container + d.top += sC.insetTop; + d.bottom += sC.insetBottom; + d.left += sC.insetLeft; + d.right += sC.insetRight; + + return d; + } + + + /** + * @param {!Object} el + * @param {boolean=} [allStates=false] + */ +, getHoverClasses = function (el, allStates) { + var + $El = $(el) + , type = $El.data("layoutRole") + , pane = $El.data("layoutEdge") + , o = options[pane] + , root = o[type +"Class"] + , _pane = "-"+ pane // eg: "-west" + , _open = "-open" + , _closed = "-closed" + , _slide = "-sliding" + , _hover = "-hover " // NOTE the trailing space + , _state = $El.hasClass(root+_closed) ? _closed : _open + , _alt = _state === _closed ? _open : _closed + , classes = (root+_hover) + (root+_pane+_hover) + (root+_state+_hover) + (root+_pane+_state+_hover) + ; + if (allStates) // when 'removing' classes, also remove alternate-state classes + classes += (root+_alt+_hover) + (root+_pane+_alt+_hover); + + if (type=="resizer" && $El.hasClass(root+_slide)) + classes += (root+_slide+_hover) + (root+_pane+_slide+_hover); + + return $.trim(classes); + } +, addHover = function (evt, el) { + var $E = $(el || this); + if (evt && $E.data("layoutRole") === "toggler") + evt.stopPropagation(); // prevent triggering 'slide' on Resizer-bar + $E.addClass( getHoverClasses($E) ); + } +, removeHover = function (evt, el) { + var $E = $(el || this); + $E.removeClass( getHoverClasses($E, true) ); + } + +, onResizerEnter = function (evt) { // ALSO called by toggler.mouseenter + if ($.fn.disableSelection) + $("body").disableSelection(); + } +, onResizerLeave = function (evt, el) { + var + e = el || this // el is only passed when called by the timer + , pane = $(e).data("layoutEdge") + , name = pane +"ResizerLeave" + ; + timer.clear(pane+"_openSlider"); // cancel slideOpen timer, if set + timer.clear(name); // cancel enableSelection timer - may re/set below + // this method calls itself on a timer because it needs to allow + // enough time for dragging to kick-in and set the isResizing flag + // dragging has a 100ms delay set, so this delay must be >100 + if (!el) // 1st call - mouseleave event + timer.set(name, function(){ onResizerLeave(evt, e); }, 200); + // if user is resizing, then dragStop will enableSelection(), so can skip it here + else if (!state[pane].isResizing && $.fn.enableSelection) // 2nd call - by timer + $("body").enableSelection(); + } + +/* + * ########################### + * INITIALIZATION METHODS + * ########################### + */ + + /** + * Initialize the layout - called automatically whenever an instance of layout is created + * + * @see none - triggered onInit + * @return mixed true = fully initialized | false = panes not initialized (yet) | 'cancel' = abort + */ +, _create = function () { + // initialize config/options + initOptions(); + var o = options; + + // TEMP state so isInitialized returns true during init process + state.creatingLayout = true; + + // init plugins for this layout, if there are any (eg: stateManagement) + runPluginCallbacks( Instance, $.layout.onCreate ); + + // options & state have been initialized, so now run beforeLoad callback + // onload will CANCEL layout creation if it returns false + if (false === _runCallbacks("onload_start")) + return 'cancel'; + + // initialize the container element + _initContainer(); + + // bind hotkey function - keyDown - if required + initHotkeys(); + + // bind window.onunload + $(window).bind("unload."+ sID, unload); + + // init plugins for this layout, if there are any (eg: customButtons) + runPluginCallbacks( Instance, $.layout.onLoad ); + + // if layout elements are hidden, then layout WILL NOT complete initialization! + // initLayoutElements will set initialized=true and run the onload callback IF successful + if (o.initPanes) _initLayoutElements(); + + delete state.creatingLayout; + + return state.initialized; + } + + /** + * Initialize the layout IF not already + * + * @see All methods in Instance run this test + * @return boolean true = layoutElements have been initialized | false = panes are not initialized (yet) + */ +, isInitialized = function () { + if (state.initialized || state.creatingLayout) return true; // already initialized + else return _initLayoutElements(); // try to init panes NOW + } + + /** + * Initialize the layout - called automatically whenever an instance of layout is created + * + * @see _create() & isInitialized + * @return An object pointer to the instance created + */ +, _initLayoutElements = function (retry) { + // initialize config/options + var o = options; + + // CANNOT init panes inside a hidden container! + if (!$N.is(":visible")) { + // handle Chrome bug where popup window 'has no height' + // if layout is BODY element, try again in 50ms + // SEE: http://layout.jquery-dev.net/samples/test_popup_window.html + if ( !retry && browser.webkit && $N[0].tagName === "BODY" ) + setTimeout(function(){ _initLayoutElements(true); }, 50); + return false; + } + + // a center pane is required, so make sure it exists + if (!getPane("center").length) { + if (options.showErrorMessages) + _log( lang.errCenterPaneMissing, true ); + return false; + } + + // TEMP state so isInitialized returns true during init process + state.creatingLayout = true; + + // update Container dims + $.extend(sC, elDims( $N )); + + // initialize all layout elements + initPanes(); // size & position panes - calls initHandles() - which calls initResizable() + + if (o.scrollToBookmarkOnLoad) { + var l = self.location; + if (l.hash) l.replace( l.hash ); // scrollTo Bookmark + } + + // check to see if this layout 'nested' inside a pane + if (Instance.hasParentLayout) + o.resizeWithWindow = false; + // bind resizeAll() for 'this layout instance' to window.resize event + else if (o.resizeWithWindow) + $(window).bind("resize."+ sID, windowResize); + + delete state.creatingLayout; + state.initialized = true; + + // init plugins for this layout, if there are any + runPluginCallbacks( Instance, $.layout.onReady ); + + // now run the onload callback, if exists + _runCallbacks("onload_end"); + + return true; // elements initialized successfully + } + + /** + * Initialize nested layouts - called when _initLayoutElements completes + * + * NOT CURRENTLY USED + * + * @see _initLayoutElements + * @return An object pointer to the instance created + */ +, _initChildLayouts = function () { + $.each(_c.allPanes, function (idx, pane) { + if (options[pane].initChildLayout) + createChildLayout( pane ); + }); + } + + /** + * Initialize nested layouts for a specific pane - can optionally pass layout-options + * + * @see _initChildLayouts + * @param {string} pane The pane being opened, ie: north, south, east, or west + * @param {Object=} [opts] Layout-options - if passed, will OVERRRIDE options[pane].childOptions + * @return An object pointer to the layout instance created - or null + */ +, createChildLayout = function (evt_or_pane, opts) { + var pane = evtPane.call(this, evt_or_pane) + , $P = $Ps[pane] + , C = children + ; + if ($P) { + var $C = $Cs[pane] + , o = opts || options[pane].childOptions + , d = "layout" + // determine which element is supposed to be the 'child container' + // if pane has a 'containerSelector' OR a 'content-div', use those instead of the pane + , $Cont = o.containerSelector ? $P.find( o.containerSelector ) : ($C || $P) + , containerFound = $Cont.length + // see if a child-layout ALREADY exists on this element + , child = containerFound ? (C[pane] = $Cont.data(d) || null) : null + ; + // if no layout exists, but childOptions are set, try to create the layout now + if (!child && containerFound && o) + child = C[pane] = $Cont.eq(0).layout(o) || null; + if (child) + child.hasParentLayout = true; // set parent-flag in child + } + Instance[pane].child = C[pane]; // ALWAYS set pane-object pointer, even if null + } + +, windowResize = function () { + var delay = Number(options.resizeWithWindowDelay); + if (delay < 10) delay = 100; // MUST have a delay! + // resizing uses a delay-loop because the resize event fires repeatly - except in FF, but delay anyway + timer.clear("winResize"); // if already running + timer.set("winResize", function(){ + timer.clear("winResize"); + timer.clear("winResizeRepeater"); + var dims = elDims( $N ); + // only trigger resizeAll() if container has changed size + if (dims.innerWidth !== sC.innerWidth || dims.innerHeight !== sC.innerHeight) + resizeAll(); + }, delay); + // ALSO set fixed-delay timer, if not already running + if (!timer.data["winResizeRepeater"]) setWindowResizeRepeater(); + } + +, setWindowResizeRepeater = function () { + var delay = Number(options.resizeWithWindowMaxDelay); + if (delay > 0) + timer.set("winResizeRepeater", function(){ setWindowResizeRepeater(); resizeAll(); }, delay); + } + +, unload = function () { + var o = options; + + _runCallbacks("onunload_start"); + + // trigger plugin callabacks for this layout (eg: stateManagement) + runPluginCallbacks( Instance, $.layout.onUnload ); + + _runCallbacks("onunload_end"); + } + + /** + * Validate and initialize container CSS and events + * + * @see _create() + */ +, _initContainer = function () { + var + N = $N[0] + , tag = sC.tagName = N.tagName + , id = sC.id = N.id + , cls = sC.className = N.className + , o = options + , name = o.name + , fullPage= (tag === "BODY") + , props = "overflow,position,margin,padding,border" + , css = "layoutCSS" + , CSS = {} + , hid = "hidden" // used A LOT! + // see if this container is a 'pane' inside an outer-layout + , parent = $N.data("parentLayout") // parent-layout Instance + , pane = $N.data("layoutEdge") // pane-name in parent-layout + , isChild = parent && pane + ; + // sC -> state.container + sC.selector = $N.selector.split(".slice")[0]; + sC.ref = (o.name ? o.name +' layout / ' : '') + tag + (id ? "#"+id : cls ? '.['+cls+']' : ''); // used in messages + + $N .data({ + layout: Instance + , layoutContainer: sID // FLAG to indicate this is a layout-container - contains unique internal ID + }) + .addClass(o.containerClass) + ; + var layoutMethods = { + destroy: '' + , initPanes: '' + , resizeAll: 'resizeAll' + , resize: 'resizeAll' + } + , name; + // loop hash and bind all methods - include layoutID namespacing + for (name in layoutMethods) { + $N.bind("layout"+ name.toLowerCase() +"."+ sID, Instance[ layoutMethods[name] || name ]); + } + + // if this container is another layout's 'pane', then set child/parent pointers + if (isChild) { + // update parent flag + Instance.hasParentLayout = true; + // set pointers to THIS child-layout (Instance) in parent-layout + // NOTE: parent.PANE.child is an ALIAS to parent.children.PANE + parent[pane].child = parent.children[pane] = $N.data("layout"); + } + + // SAVE original container CSS for use in destroy() + if (!$N.data(css)) { + // handle props like overflow different for BODY & HTML - has 'system default' values + if (fullPage) { + CSS = $.extend( elCSS($N, props), { + height: $N.css("height") + , overflow: $N.css("overflow") + , overflowX: $N.css("overflowX") + , overflowY: $N.css("overflowY") + }); + // ALSO SAVE CSS + var $H = $("html"); + $H.data(css, { + height: "auto" // FF would return a fixed px-size! + , overflow: $H.css("overflow") + , overflowX: $H.css("overflowX") + , overflowY: $H.css("overflowY") + }); + } + else // handle props normally for non-body elements + CSS = elCSS($N, props+",top,bottom,left,right,width,height,overflow,overflowX,overflowY"); + + $N.data(css, CSS); + } + + try { // format html/body if this is a full page layout + if (fullPage) { + $("html").css({ + height: "100%" + , overflow: hid + , overflowX: hid + , overflowY: hid + }); + $("body").css({ + position: "relative" + , height: "100%" + , overflow: hid + , overflowX: hid + , overflowY: hid + , margin: 0 + , padding: 0 // TODO: test whether body-padding could be handled? + , border: "none" // a body-border creates problems because it cannot be measured! + }); + + // set current layout-container dimensions + $.extend(sC, elDims( $N )); + } + else { // set required CSS for overflow and position + // ENSURE container will not 'scroll' + CSS = { overflow: hid, overflowX: hid, overflowY: hid } + var + p = $N.css("position") + , h = $N.css("height") + ; + // if this is a NESTED layout, then container/outer-pane ALREADY has position and height + if (!isChild) { + if (!p || !p.match(/fixed|absolute|relative/)) + CSS.position = "relative"; // container MUST have a 'position' + /* + if (!h || h=="auto") + CSS.height = "100%"; // container MUST have a 'height' + */ + } + $N.css( CSS ); + + // set current layout-container dimensions + if ( $N.is(":visible") ) { + $.extend(sC, elDims( $N )); + if (o.showErrorMessages && sC.innerHeight < 1) + _log( lang.errContainerHeight.replace(/CONTAINER/, sC.ref), true ); + } + } + } catch (ex) {} + } + + /** + * Bind layout hotkeys - if options enabled + * + * @see _create() and addPane() + * @param {string=} [panes=""] The edge(s) to process + */ +, initHotkeys = function (panes) { + panes = panes ? panes.split(",") : _c.borderPanes; + // bind keyDown to capture hotkeys, if option enabled for ANY pane + $.each(panes, function (i, pane) { + var o = options[pane]; + if (o.enableCursorHotkey || o.customHotkey) { + $(document).bind("keydown."+ sID, keyDown); // only need to bind this ONCE + return false; // BREAK - binding was done + } + }); + } + + /** + * Build final OPTIONS data + * + * @see _create() + */ +, initOptions = function () { + var data, d, pane, key, val, i, c, o; + + // reprocess user's layout-options to have correct options sub-key structure + opts = $.layout.transformData( opts ); // panes = default subkey + + // auto-rename old options for backward compatibility + opts = $.layout.backwardCompatibility.renameAllOptions( opts ); + + // if user-options has 'panes' key (pane-defaults), process it... + if (!$.isEmptyObject(opts.panes)) { + // REMOVE any pane-defaults that MUST be set per-pane + data = $.layout.optionsMap.noDefault; + for (i=0, c=data.length; i 0) { + z.pane_normal = zo; + z.content_mask = max(zo+1, z.content_mask); // MIN = +1 + z.resizer_normal = max(zo+2, z.resizer_normal); // MIN = +2 + } + + function createFxOptions ( pane ) { + var o = options[pane] + , d = options.panes; + // ensure fxSettings key to avoid errors + if (!o.fxSettings) o.fxSettings = {}; + if (!d.fxSettings) d.fxSettings = {}; + + $.each(["_open","_close","_size"], function (i,n) { + var + sName = "fxName"+ n + , sSpeed = "fxSpeed"+ n + , sSettings = "fxSettings"+ n + // recalculate fxName according to specificity rules + , fxName = o[sName] = + o[sName] // options.west.fxName_open + || d[sName] // options.panes.fxName_open + || o.fxName // options.west.fxName + || d.fxName // options.panes.fxName + || "none" // MEANS $.layout.defaults.panes.fxName == "" || false || null || 0 + ; + // validate fxName to ensure is valid effect - MUST have effect-config data in options.effects + if (fxName === "none" || !$.effects || !$.effects[fxName] || !options.effects[fxName]) + fxName = o[sName] = "none"; // effect not loaded OR unrecognized fxName + + // set vars for effects subkeys to simplify logic + var fx = options.effects[fxName] || {} // effects.slide + , fx_all = fx.all || null // effects.slide.all + , fx_pane = fx[pane] || null // effects.slide.west + ; + // create fxSpeed[_open|_close|_size] + o[sSpeed] = + o[sSpeed] // options.west.fxSpeed_open + || d[sSpeed] // options.west.fxSpeed_open + || o.fxSpeed // options.west.fxSpeed + || d.fxSpeed // options.panes.fxSpeed + || null // DEFAULT - let fxSetting.duration control speed + ; + // create fxSettings[_open|_close|_size] + o[sSettings] = $.extend( + {} + , fx_all // effects.slide.all + , fx_pane // effects.slide.west + , d.fxSettings // options.panes.fxSettings + , o.fxSettings // options.west.fxSettings + , d[sSettings] // options.panes.fxSettings_open + , o[sSettings] // options.west.fxSettings_open + ); + }); + + // DONE creating action-specific-settings for this pane, + // so DELETE generic options - are no longer meaningful + delete o.fxName; + delete o.fxSpeed; + delete o.fxSettings; + } + + // DELETE 'panes' key now that we are done - values were copied to EACH pane + delete options.panes; + } + + /** + * Initialize module objects, styling, size and position for all panes + * + * @see _initElements() + * @param {string} pane The pane to process + */ +, getPane = function (pane) { + var sel = options[pane].paneSelector + if (sel.substr(0,1)==="#") // ID selector + // NOTE: elements selected 'by ID' DO NOT have to be 'children' + return $N.find(sel).eq(0); + else { // class or other selector + var $P = $N.children(sel).eq(0); + // look for the pane nested inside a 'form' element + return $P.length ? $P : $N.children("form:first").children(sel).eq(0); + } + } + +, initPanes = function () { + // NOTE: do north & south FIRST so we can measure their height - do center LAST + $.each(_c.allPanes, function (idx, pane) { + addPane( pane, true ); + }); + + // init the pane-handles NOW in case we have to hide or close the pane below + initHandles(); + + // now that all panes have been initialized and initially-sized, + // make sure there is really enough space available for each pane + $.each(_c.borderPanes, function (i, pane) { + if ($Ps[pane] && state[pane].isVisible) { // pane is OPEN + setSizeLimits(pane); + makePaneFit(pane); // pane may be Closed, Hidden or Resized by makePaneFit() + } + }); + // size center-pane AGAIN in case we 'closed' a border-pane in loop above + sizeMidPanes("center"); + + // Chrome/Webkit sometimes fires callbacks BEFORE it completes resizing! + // Before RC30.3, there was a 10ms delay here, but that caused layout + // to load asynchrously, which is BAD, so try skipping delay for now + + // process pane contents and callbacks, and init/resize child-layout if exists + $.each(_c.allPanes, function (i, pane) { + var o = options[pane]; + if ($Ps[pane]) { + if (state[pane].isVisible) { // pane is OPEN + sizeContent(pane); + // trigger pane.onResize if triggerEventsOnLoad = true + if (o.triggerEventsOnLoad) + _runCallbacks("onresize_end", pane); + else // automatic if onresize called, otherwise call it specifically + // resize child - IF inner-layout already exists (created before this layout) + resizeChildLayout(pane); + } + // init childLayout - even if pane is not visible + if (o.initChildLayout && o.childOptions) + createChildLayout(pane); + } + }); + } + + /** + * Add a pane to the layout - subroutine of initPanes() + * + * @see initPanes() + * @param {string} pane The pane to process + * @param {boolean=} [force=false] Size content after init + */ +, addPane = function (pane, force) { + if (!force && !isInitialized()) return; + var + o = options[pane] + , s = state[pane] + , c = _c[pane] + , fx = s.fx + , dir = c.dir + , spacing = o.spacing_open || 0 + , isCenter = (pane === "center") + , CSS = {} + , $P = $Ps[pane] + , size, minSize, maxSize + ; + // if pane-pointer already exists, remove the old one first + if ($P) + removePane( pane, false, true, false ); + else + $Cs[pane] = false; // init + + $P = $Ps[pane] = getPane(pane); + if (!$P.length) { + $Ps[pane] = false; // logic + return; + } + + // SAVE original Pane CSS + if (!$P.data("layoutCSS")) { + var props = "position,top,left,bottom,right,width,height,overflow,zIndex,display,backgroundColor,padding,margin,border"; + $P.data("layoutCSS", elCSS($P, props)); + } + + // create alias for pane data in Instance - initHandles will add more + Instance[pane] = { name: pane, pane: $Ps[pane], content: $Cs[pane], options: options[pane], state: state[pane], child: children[pane] }; + + // add classes, attributes & events + $P .data({ + parentLayout: Instance // pointer to Layout Instance + , layoutPane: Instance[pane] // NEW pointer to pane-alias-object + , layoutEdge: pane + , layoutRole: "pane" + }) + .css(c.cssReq).css("zIndex", options.zIndexes.pane_normal) + .css(o.applyDemoStyles ? c.cssDemo : {}) // demo styles + .addClass( o.paneClass +" "+ o.paneClass+"-"+pane ) // default = "ui-layout-pane ui-layout-pane-west" - may be a dupe of 'paneSelector' + .bind("mouseenter."+ sID, addHover ) + .bind("mouseleave."+ sID, removeHover ) + ; + var paneMethods = { + hide: '' + , show: '' + , toggle: '' + , close: '' + , open: '' + , slideOpen: '' + , slideClose: '' + , slideToggle: '' + , size: 'manualSizePane' + , sizePane: 'manualSizePane' + , sizeContent: '' + , sizeHandles: '' + , enableClosable: '' + , disableClosable: '' + , enableSlideable: '' + , disableSlideable: '' + , enableResizable: '' + , disableResizable: '' + , swapPanes: 'swapPanes' + , swap: 'swapPanes' + , move: 'swapPanes' + , removePane: 'removePane' + , remove: 'removePane' + , createChildLayout: '' + , resizeChildLayout: '' + , resizeAll: 'resizeAll' + , resizeLayout: 'resizeAll' + } + , name; + // loop hash and bind all methods - include layoutID namespacing + for (name in paneMethods) { + $P.bind("layoutpane"+ name.toLowerCase() +"."+ sID, Instance[ paneMethods[name] || name ]); + } + + // see if this pane has a 'scrolling-content element' + initContent(pane, false); // false = do NOT sizeContent() - called later + + if (!isCenter) { + // call _parseSize AFTER applying pane classes & styles - but before making visible (if hidden) + // if o.size is auto or not valid, then MEASURE the pane and use that as its 'size' + size = s.size = _parseSize(pane, o.size); + minSize = _parseSize(pane,o.minSize) || 1; + maxSize = _parseSize(pane,o.maxSize) || 100000; + if (size > 0) size = max(min(size, maxSize), minSize); + + // state for border-panes + s.isClosed = false; // true = pane is closed + s.isSliding = false; // true = pane is currently open by 'sliding' over adjacent panes + s.isResizing= false; // true = pane is in process of being resized + s.isHidden = false; // true = pane is hidden - no spacing, resizer or toggler is visible! + + // array for 'pin buttons' whose classNames are auto-updated on pane-open/-close + if (!s.pins) s.pins = []; + } + // states common to ALL panes + s.tagName = $P[0].tagName; + s.edge = pane; // useful if pane is (or about to be) 'swapped' - easy find out where it is (or is going) + s.noRoom = false; // true = pane 'automatically' hidden due to insufficient room - will unhide automatically + s.isVisible = true; // false = pane is invisible - closed OR hidden - simplify logic + + // set css-position to account for container borders & padding + switch (pane) { + case "north": CSS.top = sC.insetTop; + CSS.left = sC.insetLeft; + CSS.right = sC.insetRight; + break; + case "south": CSS.bottom = sC.insetBottom; + CSS.left = sC.insetLeft; + CSS.right = sC.insetRight; + break; + case "west": CSS.left = sC.insetLeft; // top, bottom & height set by sizeMidPanes() + break; + case "east": CSS.right = sC.insetRight; // ditto + break; + case "center": // top, left, width & height set by sizeMidPanes() + } + + if (dir === "horz") // north or south pane + CSS.height = cssH($P, size); + else if (dir === "vert") // east or west pane + CSS.width = cssW($P, size); + //else if (isCenter) {} + + $P.css(CSS); // apply size -- top, bottom & height will be set by sizeMidPanes + if (dir != "horz") sizeMidPanes(pane, true); // true = skipCallback + + // close or hide the pane if specified in settings + if (o.initClosed && o.closable && !o.initHidden) + close(pane, true, true); // true, true = force, noAnimation + else if (o.initHidden || o.initClosed) + hide(pane); // will be completely invisible - no resizer or spacing + else if (!s.noRoom) + // make the pane visible - in case was initially hidden + $P.css("display","block"); + // ELSE setAsOpen() - called later by initHandles() + + // RESET visibility now - pane will appear IF display:block + $P.css("visibility","visible"); + + // check option for auto-handling of pop-ups & drop-downs + if (o.showOverflowOnHover) + $P.hover( allowOverflow, resetOverflow ); + + // if manually adding a pane AFTER layout initialization, then... + if (state.initialized) { + initHandles( pane ); + initHotkeys( pane ); + resizeAll(); // will sizeContent if pane is visible + if (s.isVisible) { // pane is OPEN + if (o.triggerEventsOnLoad) + _runCallbacks("onresize_end", pane); + else // automatic if onresize called, otherwise call it specifically + // resize child - IF inner-layout already exists (created before this layout) + resizeChildLayout(pane); // a previously existing childLayout + } + if (o.initChildLayout && o.childOptions) + createChildLayout(pane); + } + } + + /** + * Initialize module objects, styling, size and position for all resize bars and toggler buttons + * + * @see _create() + * @param {string=} [panes=""] The edge(s) to process + */ +, initHandles = function (panes) { + panes = panes ? panes.split(",") : _c.borderPanes; + + // create toggler DIVs for each pane, and set object pointers for them, eg: $R.north = north toggler DIV + $.each(panes, function (i, pane) { + var $P = $Ps[pane]; + $Rs[pane] = false; // INIT + $Ts[pane] = false; + if (!$P) return; // pane does not exist - skip + + var + o = options[pane] + , s = state[pane] + , c = _c[pane] + , rClass = o.resizerClass + , tClass = o.togglerClass + , side = c.side.toLowerCase() + , spacing = (s.isVisible ? o.spacing_open : o.spacing_closed) + , _pane = "-"+ pane // used for classNames + , _state = (s.isVisible ? "-open" : "-closed") // used for classNames + , I = Instance[pane] + // INIT RESIZER BAR + , $R = I.resizer = $Rs[pane] = $("
      ") + // INIT TOGGLER BUTTON + , $T = I.toggler = (o.closable ? $Ts[pane] = $("
      ") : false) + ; + + //if (s.isVisible && o.resizable) ... handled by initResizable + if (!s.isVisible && o.slidable) + $R.attr("title", o.sliderTip).css("cursor", o.sliderCursor); + + $R // if paneSelector is an ID, then create a matching ID for the resizer, eg: "#paneLeft" => "paneLeft-resizer" + .attr("id", (o.paneSelector.substr(0,1)=="#" ? o.paneSelector.substr(1) + "-resizer" : "")) + .data({ + parentLayout: Instance + , layoutPane: Instance[pane] // NEW pointer to pane-alias-object + , layoutEdge: pane + , layoutRole: "resizer" + }) + .css(_c.resizers.cssReq).css("zIndex", options.zIndexes.resizer_normal) + .css(o.applyDemoStyles ? _c.resizers.cssDemo : {}) // add demo styles + .addClass(rClass +" "+ rClass+_pane) + .hover(addHover, removeHover) // ALWAYS add hover-classes, even if resizing is not enabled - handle with CSS instead + .hover(onResizerEnter, onResizerLeave) // ALWAYS NEED resizer.mouseleave to balance toggler.mouseenter + .appendTo($N) // append DIV to container + ; + + if ($T) { + $T // if paneSelector is an ID, then create a matching ID for the resizer, eg: "#paneLeft" => "#paneLeft-toggler" + .attr("id", (o.paneSelector.substr(0,1)=="#" ? o.paneSelector.substr(1) + "-toggler" : "")) + .data({ + parentLayout: Instance + , layoutPane: Instance[pane] // NEW pointer to pane-alias-object + , layoutEdge: pane + , layoutRole: "toggler" + }) + .css(_c.togglers.cssReq) // add base/required styles + .css(o.applyDemoStyles ? _c.togglers.cssDemo : {}) // add demo styles + .addClass(tClass +" "+ tClass+_pane) + .hover(addHover, removeHover) // ALWAYS add hover-classes, even if toggling is not enabled - handle with CSS instead + .bind("mouseenter", onResizerEnter) // NEED toggler.mouseenter because mouseenter MAY NOT fire on resizer + .appendTo($R) // append SPAN to resizer DIV + ; + // ADD INNER-SPANS TO TOGGLER + if (o.togglerContent_open) // ui-layout-open + $(""+ o.togglerContent_open +"") + .data({ + layoutEdge: pane + , layoutRole: "togglerContent" + }) + .data("layoutRole", "togglerContent") + .data("layoutEdge", pane) + .addClass("content content-open") + .css("display","none") + .appendTo( $T ) + //.hover( addHover, removeHover ) // use ui-layout-toggler-west-hover .content-open instead! + ; + if (o.togglerContent_closed) // ui-layout-closed + $(""+ o.togglerContent_closed +"") + .data({ + layoutEdge: pane + , layoutRole: "togglerContent" + }) + .addClass("content content-closed") + .css("display","none") + .appendTo( $T ) + //.hover( addHover, removeHover ) // use ui-layout-toggler-west-hover .content-closed instead! + ; + // ADD TOGGLER.click/.hover + enableClosable(pane); + } + + // add Draggable events + initResizable(pane); + + // ADD CLASSNAMES & SLIDE-BINDINGS - eg: class="resizer resizer-west resizer-open" + if (s.isVisible) + setAsOpen(pane); // onOpen will be called, but NOT onResize + else { + setAsClosed(pane); // onClose will be called + bindStartSlidingEvent(pane, true); // will enable events IF option is set + } + + }); + + // SET ALL HANDLE DIMENSIONS + sizeHandles(); + } + + + /** + * Initialize scrolling ui-layout-content div - if exists + * + * @see initPane() - or externally after an Ajax injection + * @param {string} [pane] The pane to process + * @param {boolean=} [resize=true] Size content after init + */ +, initContent = function (pane, resize) { + if (!isInitialized()) return; + var + o = options[pane] + , sel = o.contentSelector + , I = Instance[pane] + , $P = $Ps[pane] + , $C + ; + if (sel) $C = I.content = $Cs[pane] = (o.findNestedContent) + ? $P.find(sel).eq(0) // match 1-element only + : $P.children(sel).eq(0) + ; + if ($C && $C.length) { + $C.data("layoutRole", "content"); + // SAVE original Pane CSS + if (!$C.data("layoutCSS")) + $C.data("layoutCSS", elCSS($C, "height")); + $C.css( _c.content.cssReq ); + if (o.applyDemoStyles) { + $C.css( _c.content.cssDemo ); // add padding & overflow: auto to content-div + $P.css( _c.content.cssDemoPane ); // REMOVE padding/scrolling from pane + } + state[pane].content = {}; // init content state + if (resize !== false) sizeContent(pane); + // sizeContent() is called AFTER init of all elements + } + else + I.content = $Cs[pane] = false; + } + + + /** + * Add resize-bars to all panes that specify it in options + * -dependancy: $.fn.resizable - will skip if not found + * + * @see _create() + * @param {string=} [panes=""] The edge(s) to process + */ +, initResizable = function (panes) { + var draggingAvailable = $.layout.plugins.draggable + , side // set in start() + ; + panes = panes ? panes.split(",") : _c.borderPanes; + + $.each(panes, function (idx, pane) { + var o = options[pane]; + if (!draggingAvailable || !$Ps[pane] || !o.resizable) { + o.resizable = false; + return true; // skip to next + } + + var s = state[pane] + , z = options.zIndexes + , c = _c[pane] + , side = c.dir=="horz" ? "top" : "left" + , opEdge = _c.oppositeEdge[pane] + , masks = pane +",center,"+ opEdge + (c.dir=="horz" ? ",west,east" : "") + , $P = $Ps[pane] + , $R = $Rs[pane] + , base = o.resizerClass + , lastPos = 0 // used when live-resizing + , r, live // set in start because may change + // 'drag' classes are applied to the ORIGINAL resizer-bar while dragging is in process + , resizerClass = base+"-drag" // resizer-drag + , resizerPaneClass = base+"-"+pane+"-drag" // resizer-north-drag + // 'helper' class is applied to the CLONED resizer-bar while it is being dragged + , helperClass = base+"-dragging" // resizer-dragging + , helperPaneClass = base+"-"+pane+"-dragging" // resizer-north-dragging + , helperLimitClass = base+"-dragging-limit" // resizer-drag + , helperPaneLimitClass = base+"-"+pane+"-dragging-limit" // resizer-north-drag + , helperClassesSet = false // logic var + ; + + if (!s.isClosed) + $R.attr("title", o.resizerTip) + .css("cursor", o.resizerCursor); // n-resize, s-resize, etc + + $R.draggable({ + containment: $N[0] // limit resizing to layout container + , axis: (c.dir=="horz" ? "y" : "x") // limit resizing to horz or vert axis + , delay: 0 + , distance: 1 + , grid: o.resizingGrid + // basic format for helper - style it using class: .ui-draggable-dragging + , helper: "clone" + , opacity: o.resizerDragOpacity + , addClasses: false // avoid ui-state-disabled class when disabled + //, iframeFix: o.draggableIframeFix // TODO: consider using when bug is fixed + , zIndex: z.resizer_drag + + , start: function (e, ui) { + // REFRESH options & state pointers in case we used swapPanes + o = options[pane]; + s = state[pane]; + // re-read options + live = o.livePaneResizing; + + // ondrag_start callback - will CANCEL hide if returns false + // TODO: dragging CANNOT be cancelled like this, so see if there is a way? + if (false === _runCallbacks("ondrag_start", pane)) return false; + + s.isResizing = true; // prevent pane from closing while resizing + timer.clear(pane+"_closeSlider"); // just in case already triggered + + // SET RESIZER LIMITS - used in drag() + setSizeLimits(pane); // update pane/resizer state + r = s.resizerPosition; + lastPos = ui.position[ side ] + + $R.addClass( resizerClass +" "+ resizerPaneClass ); // add drag classes + helperClassesSet = false; // reset logic var - see drag() + + // DISABLE TEXT SELECTION (probably already done by resizer.mouseOver) + $('body').disableSelection(); + + // MASK PANES CONTAINING IFRAMES, APPLETS OR OTHER TROUBLESOME ELEMENTS + showMasks( masks ); + } + + , drag: function (e, ui) { + if (!helperClassesSet) { // can only add classes after clone has been added to the DOM + //$(".ui-draggable-dragging") + ui.helper + .addClass( helperClass +" "+ helperPaneClass ) // add helper classes + .css({ right: "auto", bottom: "auto" }) // fix dir="rtl" issue + .children().css("visibility","hidden") // hide toggler inside dragged resizer-bar + ; + helperClassesSet = true; + // draggable bug!? RE-SET zIndex to prevent E/W resize-bar showing through N/S pane! + if (s.isSliding) $Ps[pane].css("zIndex", z.pane_sliding); + } + // CONTAIN RESIZER-BAR TO RESIZING LIMITS + var limit = 0; + if (ui.position[side] < r.min) { + ui.position[side] = r.min; + limit = -1; + } + else if (ui.position[side] > r.max) { + ui.position[side] = r.max; + limit = 1; + } + // ADD/REMOVE dragging-limit CLASS + if (limit) { + ui.helper.addClass( helperLimitClass +" "+ helperPaneLimitClass ); // at dragging-limit + window.defaultStatus = (limit>0 && pane.match(/north|west/)) || (limit<0 && pane.match(/south|east/)) ? lang.maxSizeWarning : lang.minSizeWarning; + } + else { + ui.helper.removeClass( helperLimitClass +" "+ helperPaneLimitClass ); // not at dragging-limit + window.defaultStatus = ""; + } + // DYNAMICALLY RESIZE PANES IF OPTION ENABLED + // won't trigger unless resizer has actually moved! + if (live && Math.abs(ui.position[side] - lastPos) >= o.liveResizingTolerance) { + lastPos = ui.position[side]; + resizePanes(e, ui, pane) + } + } + + , stop: function (e, ui) { + $('body').enableSelection(); // RE-ENABLE TEXT SELECTION + window.defaultStatus = ""; // clear 'resizing limit' message from statusbar + $R.removeClass( resizerClass +" "+ resizerPaneClass ); // remove drag classes from Resizer + s.isResizing = false; + resizePanes(e, ui, pane, true, masks); // true = resizingDone + } + + }); + }); + + /** + * resizePanes + * + * Sub-routine called from stop() - and drag() if livePaneResizing + * + * @param {!Object} evt + * @param {!Object} ui + * @param {string} pane + * @param {boolean=} [resizingDone=false] + */ + var resizePanes = function (evt, ui, pane, resizingDone, masks) { + var dragPos = ui.position + , c = _c[pane] + , o = options[pane] + , s = state[pane] + , resizerPos + ; + switch (pane) { + case "north": resizerPos = dragPos.top; break; + case "west": resizerPos = dragPos.left; break; + case "south": resizerPos = sC.offsetHeight - dragPos.top - o.spacing_open; break; + case "east": resizerPos = sC.offsetWidth - dragPos.left - o.spacing_open; break; + }; + // remove container margin from resizer position to get the pane size + var newSize = resizerPos - sC["inset"+ c.side]; + + // Disable OR Resize Mask(s) created in drag.start + if (!resizingDone) { + // ensure we meet liveResizingTolerance criteria + if (Math.abs(newSize - s.size) < o.liveResizingTolerance) + return; // SKIP resize this time + // resize the pane + manualSizePane(pane, newSize, false, true); // true = noAnimation + sizeMasks(); // resize all visible masks + } + else { // resizingDone + // ondrag_end callback + if (false !== _runCallbacks("ondrag_end", pane)) + manualSizePane(pane, newSize, false, true); // true = noAnimation + hideMasks(); // hide all masks, which include panes with 'content/iframe-masks' + if (s.isSliding && masks) // RE-SHOW only 'object-masks' so objects won't show through sliding pane + showMasks( masks, true ); // true = onlyForObjects + } + }; + } + + /** + * sizeMask + * + * Needed to overlay a DIV over an IFRAME-pane because mask CANNOT be *inside* the pane + * Called when mask created, and during livePaneResizing + */ +, sizeMask = function () { + var $M = $(this) + , pane = $M.data("layoutMask") // eg: "west" + , s = state[pane] + ; + // only masks over an IFRAME-pane need manual resizing + if (s.tagName == "IFRAME" && s.isVisible) // no need to mask closed/hidden panes + $M.css({ + top: s.offsetTop + , left: s.offsetLeft + , width: s.outerWidth + , height: s.outerHeight + }); + /* ALT Method... + var $P = $Ps[pane]; + $M.css( $P.position() ).css({ width: $P[0].offsetWidth, height: $P[0].offsetHeight }); + */ + } +, sizeMasks = function () { + $Ms.each( sizeMask ); // resize all 'visible' masks + } + +, showMasks = function (panes, onlyForObjects) { + var a = panes ? panes.split(",") : $.layout.config.allPanes + , z = options.zIndexes + , o, s; + $.each(a, function(i,p){ + s = state[p]; + o = options[p]; + if (s.isVisible && ( (!onlyForObjects && o.maskContents) || o.maskObjects )) { + getMasks(p).each(function(){ + sizeMask.call(this); + this.style.zIndex = s.isSliding ? z.pane_sliding+1 : z.pane_normal+1 + this.style.display = "block"; + }); + } + }); + } + +, hideMasks = function () { + // ensure no pane is resizing - could be a timing issue + var skip; + $.each( $.layout.config.borderPanes, function(i,p){ + if (state[p].isResizing) { + skip = true; + return false; // BREAK + } + }); + if (!skip) + $Ms.hide(); // hide ALL masks + } + +, getMasks = function (pane) { + var $Masks = $([]) + , $M, i = 0, c = $Ms.length + ; + for (; i CSS + if (sC.tagName === "BODY" && ($N = $("html")).data(css)) // RESET CSS + $N.css( $N.data(css) ).removeData(css); + + // trigger plugins for this layout, if there are any + runPluginCallbacks( Instance, $.layout.onDestroy ); + + // trigger state-management and onunload callback + unload(); + + // clear the Instance of everything except for container & options (so could recreate) + // RE-CREATE: myLayout = myLayout.container.layout( myLayout.options ); + for (n in Instance) + if (!n.match(/^(container|options)$/)) delete Instance[ n ]; + // add a 'destroyed' flag to make it easy to check + Instance.destroyed = true; + + // if this is a child layout, CLEAR the child-pointer in the parent + /* for now the pointer REMAINS, but with only container, options and destroyed keys + if (parentPane) { + var layout = parentPane.pane.data("parentLayout"); + parentPane.child = layout.children[ parentPane.name ] = null; + } + */ + + return Instance; // for coding convenience + } + + /** + * Remove a pane from the layout - subroutine of destroy() + * + * @see destroy() + * @param {string} pane The pane to process + * @param {boolean=} [remove=false] Remove the DOM element? + * @param {boolean=} [skipResize=false] Skip calling resizeAll()? + */ +, removePane = function (evt_or_pane, remove, skipResize, destroyChild) { + if (!isInitialized()) return; + var pane = evtPane.call(this, evt_or_pane) + , $P = $Ps[pane] + , $C = $Cs[pane] + , $R = $Rs[pane] + , $T = $Ts[pane] + ; + //alert( '$P.length = '+ $P.length ); + // NOTE: elements can still exist even after remove() + // so check for missing data(), which is cleared by removed() + if ($P && $.isEmptyObject( $P.data() )) $P = false; + if ($C && $.isEmptyObject( $C.data() )) $C = false; + if ($R && $.isEmptyObject( $R.data() )) $R = false; + if ($T && $.isEmptyObject( $T.data() )) $T = false; + + if ($P) $P.stop(true, true); + + // check for a child layout + var o = options[pane] + , s = state[pane] + , d = "layout" + , css = "layoutCSS" + , child = children[pane] || ($P ? $P.data(d) : 0) || ($C ? $C.data(d) : 0) || null + , destroy = destroyChild !== undefined ? destroyChild : o.destroyChildLayout + ; + + // FIRST destroy the child-layout(s) + if (destroy && child && !child.destroyed) { + child.destroy(true); // tell child-layout to destroy ALL its child-layouts too + if (child.destroyed) // destroy was successful + child = null; // clear pointer for logic below + } + + if ($P && remove && !child) + $P.remove(); + else if ($P && $P[0]) { + // create list of ALL pane-classes that need to be removed + var root = o.paneClass // default="ui-layout-pane" + , pRoot = root +"-"+ pane // eg: "ui-layout-pane-west" + , _open = "-open" + , _sliding= "-sliding" + , _closed = "-closed" + , classes = [ root, root+_open, root+_closed, root+_sliding, // generic classes + pRoot, pRoot+_open, pRoot+_closed, pRoot+_sliding ] // pane-specific classes + ; + $.merge(classes, getHoverClasses($P, true)); // ADD hover-classes + // remove all Layout classes from pane-element + $P .removeClass( classes.join(" ") ) // remove ALL pane-classes + .removeData("parentLayout") + .removeData("layoutPane") + .removeData("layoutRole") + .removeData("layoutEdge") + .removeData("autoHidden") // in case set + .unbind("."+ sID) // remove ALL Layout events + // TODO: remove these extra unbind commands when jQuery is fixed + //.unbind("mouseenter"+ sID) + //.unbind("mouseleave"+ sID) + ; + // do NOT reset CSS if this pane/content is STILL the container of a nested layout! + // the nested layout will reset its 'container' CSS when/if it is destroyed + if ($C && $C.data(d)) { + // a content-div may not have a specific width, so give it one to contain the Layout + $C.width( $C.width() ); + child.resizeAll(); // now resize the Layout + } + else if ($C) + $C.css( $C.data(css) ).removeData(css).removeData("layoutRole"); + // remove pane AFTER content in case there was a nested layout + if (!$P.data(d)) + $P.css( $P.data(css) ).removeData(css); + } + + // REMOVE pane resizer and toggler elements + if ($T) $T.remove(); + if ($R) $R.remove(); + + // CLEAR all pointers and state data + Instance[pane] = $Ps[pane] = $Cs[pane] = $Rs[pane] = $Ts[pane] = children[pane] = false; + s = { removed: true }; + + if (!skipResize) + resizeAll(); + } + + +/* + * ########################### + * ACTION METHODS + * ########################### + */ + +, _hidePane = function (pane) { + var $P = $Ps[pane] + , o = options[pane] + , s = $P[0].style + ; + if (o.useOffscreenClose) { + if (!$P.data(_c.offscreenReset)) + $P.data(_c.offscreenReset, { left: s.left, right: s.right }); + $P.css( _c.offscreenCSS ); + } + else + $P.hide().removeData(_c.offscreenReset); + } + +, _showPane = function (pane) { + var $P = $Ps[pane] + , o = options[pane] + , off = _c.offscreenCSS + , old = $P.data(_c.offscreenReset) + , s = $P[0].style + ; + $P .show() // ALWAYS show, just in case + .removeData(_c.offscreenReset); + if (o.useOffscreenClose && old) { + if (s.left == off.left) + s.left = old.left; + if (s.right == off.right) + s.right = old.right; + } + } + + + /** + * Completely 'hides' a pane, including its spacing - as if it does not exist + * The pane is not actually 'removed' from the source, so can use 'show' to un-hide it + * + * @param {string} pane The pane being hidden, ie: north, south, east, or west + * @param {boolean=} [noAnimation=false] + */ +, hide = function (evt_or_pane, noAnimation) { + if (!isInitialized()) return; + var pane = evtPane.call(this, evt_or_pane) + , o = options[pane] + , s = state[pane] + , $P = $Ps[pane] + , $R = $Rs[pane] + ; + if (!$P || s.isHidden) return; // pane does not exist OR is already hidden + + // onhide_start callback - will CANCEL hide if returns false + if (state.initialized && false === _runCallbacks("onhide_start", pane)) return; + + s.isSliding = false; // just in case + + // now hide the elements + if ($R) $R.hide(); // hide resizer-bar + if (!state.initialized || s.isClosed) { + s.isClosed = true; // to trigger open-animation on show() + s.isHidden = true; + s.isVisible = false; + if (!state.initialized) + _hidePane(pane); // no animation when loading page + sizeMidPanes(_c[pane].dir === "horz" ? "" : "center"); + if (state.initialized || o.triggerEventsOnLoad) + _runCallbacks("onhide_end", pane); + } + else { + s.isHiding = true; // used by onclose + close(pane, false, noAnimation); // adjust all panes to fit + } + } + + /** + * Show a hidden pane - show as 'closed' by default unless openPane = true + * + * @param {string} pane The pane being opened, ie: north, south, east, or west + * @param {boolean=} [openPane=false] + * @param {boolean=} [noAnimation=false] + * @param {boolean=} [noAlert=false] + */ +, show = function (evt_or_pane, openPane, noAnimation, noAlert) { + if (!isInitialized()) return; + var pane = evtPane.call(this, evt_or_pane) + , o = options[pane] + , s = state[pane] + , $P = $Ps[pane] + , $R = $Rs[pane] + ; + if (!$P || !s.isHidden) return; // pane does not exist OR is not hidden + + // onshow_start callback - will CANCEL show if returns false + if (false === _runCallbacks("onshow_start", pane)) return; + + s.isSliding = false; // just in case + s.isShowing = true; // used by onopen/onclose + //s.isHidden = false; - will be set by open/close - if not cancelled + + // now show the elements + //if ($R) $R.show(); - will be shown by open/close + if (openPane === false) + close(pane, true); // true = force + else + open(pane, false, noAnimation, noAlert); // adjust all panes to fit + } + + + /** + * Toggles a pane open/closed by calling either open or close + * + * @param {string} pane The pane being toggled, ie: north, south, east, or west + * @param {boolean=} [slide=false] + */ +, toggle = function (evt_or_pane, slide) { + if (!isInitialized()) return; + var evt = evtObj(evt_or_pane) + , pane = evtPane.call(this, evt_or_pane) + , s = state[pane] + ; + if (evt) // called from to $R.dblclick OR triggerPaneEvent + evt.stopImmediatePropagation(); + if (s.isHidden) + show(pane); // will call 'open' after unhiding it + else if (s.isClosed) + open(pane, !!slide); + else + close(pane); + } + + + /** + * Utility method used during init or other auto-processes + * + * @param {string} pane The pane being closed + * @param {boolean=} [setHandles=false] + */ +, _closePane = function (pane, setHandles) { + var + $P = $Ps[pane] + , s = state[pane] + ; + _hidePane(pane); + s.isClosed = true; + s.isVisible = false; + // UNUSED: if (setHandles) setAsClosed(pane, true); // true = force + } + + /** + * Close the specified pane (animation optional), and resize all other panes as needed + * + * @param {string} pane The pane being closed, ie: north, south, east, or west + * @param {boolean=} [force=false] + * @param {boolean=} [noAnimation=false] + * @param {boolean=} [skipCallback=false] + */ +, close = function (evt_or_pane, force, noAnimation, skipCallback) { + var pane = evtPane.call(this, evt_or_pane); + // if pane has been initialized, but NOT the complete layout, close pane instantly + if (!state.initialized && $Ps[pane]) { + _closePane(pane); // INIT pane as closed + return; + } + if (!isInitialized()) return; + + var + $P = $Ps[pane] + , $R = $Rs[pane] + , $T = $Ts[pane] + , o = options[pane] + , s = state[pane] + , c = _c[pane] + , doFX, isShowing, isHiding, wasSliding; + + // QUEUE in case another action/animation is in progress + $N.queue(function( queueNext ){ + + if ( !$P + || (!o.closable && !s.isShowing && !s.isHiding) // invalid request // (!o.resizable && !o.closable) ??? + || (!force && s.isClosed && !s.isShowing) // already closed + ) return queueNext(); + + // onclose_start callback - will CANCEL hide if returns false + // SKIP if just 'showing' a hidden pane as 'closed' + var abort = !s.isShowing && false === _runCallbacks("onclose_start", pane); + + // transfer logic vars to temp vars + isShowing = s.isShowing; + isHiding = s.isHiding; + wasSliding = s.isSliding; + // now clear the logic vars (REQUIRED before aborting) + delete s.isShowing; + delete s.isHiding; + + if (abort) return queueNext(); + + doFX = !noAnimation && !s.isClosed && (o.fxName_close != "none"); + s.isMoving = true; + s.isClosed = true; + s.isVisible = false; + // update isHidden BEFORE sizing panes + if (isHiding) s.isHidden = true; + else if (isShowing) s.isHidden = false; + + if (s.isSliding) // pane is being closed, so UNBIND trigger events + bindStopSlidingEvents(pane, false); // will set isSliding=false + else // resize panes adjacent to this one + sizeMidPanes(_c[pane].dir === "horz" ? "" : "center", false); // false = NOT skipCallback + + // if this pane has a resizer bar, move it NOW - before animation + setAsClosed(pane); + + // CLOSE THE PANE + if (doFX) { // animate the close + // mask panes with objects + var masks = "center"+ (c.dir=="horz" ? ",west,east" : ""); + showMasks( masks, true ); // true = ONLY mask panes with maskObjects=true + lockPaneForFX(pane, true); // need to set left/top so animation will work + $P.hide( o.fxName_close, o.fxSettings_close, o.fxSpeed_close, function () { + lockPaneForFX(pane, false); // undo + if (s.isClosed) close_2(); + queueNext(); + }); + } + else { // hide the pane without animation + _hidePane(pane); + close_2(); + queueNext(); + }; + }); + + // SUBROUTINE + function close_2 () { + s.isMoving = false; + bindStartSlidingEvent(pane, true); // will enable if o.slidable = true + + // if opposite-pane was autoClosed, see if it can be autoOpened now + var altPane = _c.oppositeEdge[pane]; + if (state[ altPane ].noRoom) { + setSizeLimits( altPane ); + makePaneFit( altPane ); + } + + // hide any masks shown while closing + hideMasks(); + + if (!skipCallback && (state.initialized || o.triggerEventsOnLoad)) { + // onclose callback - UNLESS just 'showing' a hidden pane as 'closed' + if (!isShowing) _runCallbacks("onclose_end", pane); + // onhide OR onshow callback + if (isShowing) _runCallbacks("onshow_end", pane); + if (isHiding) _runCallbacks("onhide_end", pane); + } + } + } + + /** + * @param {string} pane The pane just closed, ie: north, south, east, or west + */ +, setAsClosed = function (pane) { + var + $P = $Ps[pane] + , $R = $Rs[pane] + , $T = $Ts[pane] + , o = options[pane] + , s = state[pane] + , side = _c[pane].side.toLowerCase() + , inset = "inset"+ _c[pane].side + , rClass = o.resizerClass + , tClass = o.togglerClass + , _pane = "-"+ pane // used for classNames + , _open = "-open" + , _sliding= "-sliding" + , _closed = "-closed" + ; + $R + .css(side, sC[inset]) // move the resizer + .removeClass( rClass+_open +" "+ rClass+_pane+_open ) + .removeClass( rClass+_sliding +" "+ rClass+_pane+_sliding ) + .addClass( rClass+_closed +" "+ rClass+_pane+_closed ) + .unbind("dblclick."+ sID) + ; + // DISABLE 'resizing' when closed - do this BEFORE bindStartSlidingEvent? + if (o.resizable && $.layout.plugins.draggable) + $R + .draggable("disable") + .removeClass("ui-state-disabled") // do NOT apply disabled styling - not suitable here + .css("cursor", "default") + .attr("title","") + ; + + // if pane has a toggler button, adjust that too + if ($T) { + $T + .removeClass( tClass+_open +" "+ tClass+_pane+_open ) + .addClass( tClass+_closed +" "+ tClass+_pane+_closed ) + .attr("title", o.togglerTip_closed) // may be blank + ; + // toggler-content - if exists + $T.children(".content-open").hide(); + $T.children(".content-closed").css("display","block"); + } + + // sync any 'pin buttons' + syncPinBtns(pane, false); + + if (state.initialized) { + // resize 'length' and position togglers for adjacent panes + sizeHandles(); + } + } + + /** + * Open the specified pane (animation optional), and resize all other panes as needed + * + * @param {string} pane The pane being opened, ie: north, south, east, or west + * @param {boolean=} [slide=false] + * @param {boolean=} [noAnimation=false] + * @param {boolean=} [noAlert=false] + */ +, open = function (evt_or_pane, slide, noAnimation, noAlert) { + if (!isInitialized()) return; + var pane = evtPane.call(this, evt_or_pane) + , $P = $Ps[pane] + , $R = $Rs[pane] + , $T = $Ts[pane] + , o = options[pane] + , s = state[pane] + , c = _c[pane] + , doFX, isShowing + ; + // QUEUE in case another action/animation is in progress + $N.queue(function( queueNext ){ + + if ( !$P + || (!o.resizable && !o.closable && !s.isShowing) // invalid request + || (s.isVisible && !s.isSliding) // already open + ) return queueNext(); + + // pane can ALSO be unhidden by just calling show(), so handle this scenario + if (s.isHidden && !s.isShowing) { + queueNext(); // call before show() because it needs the queue free + show(pane, true); + return; + } + + if (o.autoResize && s.size != o.size) // resize pane to original size set in options + sizePane(pane, o.size, true, true, true); // true=skipCallback/forceResize/noAnimation + else + // make sure there is enough space available to open the pane + setSizeLimits(pane, slide); + + // onopen_start callback - will CANCEL open if returns false + var cbReturn = _runCallbacks("onopen_start", pane); + + if (cbReturn === "abort") + return queueNext(); + + // update pane-state again in case options were changed in onopen_start + if (cbReturn !== "NC") // NC = "No Callback" + setSizeLimits(pane, slide); + + if (s.minSize > s.maxSize) { // INSUFFICIENT ROOM FOR PANE TO OPEN! + syncPinBtns(pane, false); // make sure pin-buttons are reset + if (!noAlert && o.noRoomToOpenTip) + alert(o.noRoomToOpenTip); + return queueNext(); // ABORT + } + + if (slide) // START Sliding - will set isSliding=true + bindStopSlidingEvents(pane, true); // BIND trigger events to close sliding-pane + else if (s.isSliding) // PIN PANE (stop sliding) - open pane 'normally' instead + bindStopSlidingEvents(pane, false); // UNBIND trigger events - will set isSliding=false + else if (o.slidable) + bindStartSlidingEvent(pane, false); // UNBIND trigger events + + s.noRoom = false; // will be reset by makePaneFit if 'noRoom' + makePaneFit(pane); + + // transfer logic var to temp var + isShowing = s.isShowing; + // now clear the logic var + delete s.isShowing; + + doFX = !noAnimation && s.isClosed && (o.fxName_open != "none"); + s.isMoving = true; + s.isVisible = true; + s.isClosed = false; + // update isHidden BEFORE sizing panes - WHY??? Old? + if (isShowing) s.isHidden = false; + + if (doFX) { // ANIMATE + // mask panes with objects + var masks = "center"+ (c.dir=="horz" ? ",west,east" : ""); + if (s.isSliding) masks += ","+ _c.oppositeEdge[pane]; + showMasks( masks, true ); // true = ONLY mask panes with maskObjects=true + lockPaneForFX(pane, true); // need to set left/top so animation will work + $P.show( o.fxName_open, o.fxSettings_open, o.fxSpeed_open, function() { + lockPaneForFX(pane, false); // undo + if (s.isVisible) open_2(); // continue + queueNext(); + }); + } + else { // no animation + _showPane(pane);// just show pane and... + open_2(); // continue + queueNext(); + }; + }); + + // SUBROUTINE + function open_2 () { + s.isMoving = false; + + // cure iframe display issues + _fixIframe(pane); + + // NOTE: if isSliding, then other panes are NOT 'resized' + if (!s.isSliding) { // resize all panes adjacent to this one + hideMasks(); // remove any masks shown while opening + sizeMidPanes(_c[pane].dir=="vert" ? "center" : "", false); // false = NOT skipCallback + } + + // set classes, position handles and execute callbacks... + setAsOpen(pane); + }; + + } + + /** + * @param {string} pane The pane just opened, ie: north, south, east, or west + * @param {boolean=} [skipCallback=false] + */ +, setAsOpen = function (pane, skipCallback) { + var + $P = $Ps[pane] + , $R = $Rs[pane] + , $T = $Ts[pane] + , o = options[pane] + , s = state[pane] + , side = _c[pane].side.toLowerCase() + , inset = "inset"+ _c[pane].side + , rClass = o.resizerClass + , tClass = o.togglerClass + , _pane = "-"+ pane // used for classNames + , _open = "-open" + , _closed = "-closed" + , _sliding= "-sliding" + ; + $R + .css(side, sC[inset] + getPaneSize(pane)) // move the resizer + .removeClass( rClass+_closed +" "+ rClass+_pane+_closed ) + .addClass( rClass+_open +" "+ rClass+_pane+_open ) + ; + if (s.isSliding) + $R.addClass( rClass+_sliding +" "+ rClass+_pane+_sliding ) + else // in case 'was sliding' + $R.removeClass( rClass+_sliding +" "+ rClass+_pane+_sliding ) + + if (o.resizerDblClickToggle) + $R.bind("dblclick", toggle ); + removeHover( 0, $R ); // remove hover classes + if (o.resizable && $.layout.plugins.draggable) + $R .draggable("enable") + .css("cursor", o.resizerCursor) + .attr("title", o.resizerTip); + else if (!s.isSliding) + $R.css("cursor", "default"); // n-resize, s-resize, etc + + // if pane also has a toggler button, adjust that too + if ($T) { + $T .removeClass( tClass+_closed +" "+ tClass+_pane+_closed ) + .addClass( tClass+_open +" "+ tClass+_pane+_open ) + .attr("title", o.togglerTip_open); // may be blank + removeHover( 0, $T ); // remove hover classes + // toggler-content - if exists + $T.children(".content-closed").hide(); + $T.children(".content-open").css("display","block"); + } + + // sync any 'pin buttons' + syncPinBtns(pane, !s.isSliding); + + // update pane-state dimensions - BEFORE resizing content + $.extend(s, elDims($P)); + + if (state.initialized) { + // resize resizer & toggler sizes for all panes + sizeHandles(); + // resize content every time pane opens - to be sure + sizeContent(pane, true); // true = remeasure headers/footers, even if 'pane.isMoving' + } + + if (!skipCallback && (state.initialized || o.triggerEventsOnLoad) && $P.is(":visible")) { + // onopen callback + _runCallbacks("onopen_end", pane); + // onshow callback - TODO: should this be here? + if (s.isShowing) _runCallbacks("onshow_end", pane); + + // ALSO call onresize because layout-size *may* have changed while pane was closed + if (state.initialized) + _runCallbacks("onresize_end", pane); + } + + // TODO: Somehow sizePane("north") is being called after this point??? + } + + + /** + * slideOpen / slideClose / slideToggle + * + * Pass-though methods for sliding + */ +, slideOpen = function (evt_or_pane) { + if (!isInitialized()) return; + var evt = evtObj(evt_or_pane) + , pane = evtPane.call(this, evt_or_pane) + , s = state[pane] + , delay = options[pane].slideDelay_open + ; + // prevent event from triggering on NEW resizer binding created below + if (evt) evt.stopImmediatePropagation(); + + if (s.isClosed && evt && evt.type === "mouseenter" && delay > 0) + // trigger = mouseenter - use a delay + timer.set(pane+"_openSlider", open_NOW, delay); + else + open_NOW(); // will unbind events if is already open + + /** + * SUBROUTINE for timed open + */ + function open_NOW () { + if (!s.isClosed) // skip if no longer closed! + bindStopSlidingEvents(pane, true); // BIND trigger events to close sliding-pane + else if (!s.isMoving) + open(pane, true); // true = slide - open() will handle binding + }; + } + +, slideClose = function (evt_or_pane) { + if (!isInitialized()) return; + var evt = evtObj(evt_or_pane) + , pane = evtPane.call(this, evt_or_pane) + , o = options[pane] + , s = state[pane] + , delay = s.isMoving ? 1000 : 300 // MINIMUM delay - option may override + ; + if (s.isClosed || s.isResizing) + return; // skip if already closed OR in process of resizing + else if (o.slideTrigger_close === "click") + close_NOW(); // close immediately onClick + else if (o.preventQuickSlideClose && s.isMoving) + return; // handle Chrome quick-close on slide-open + else if (o.preventPrematureSlideClose && evt && $.layout.isMouseOverElem(evt, $Ps[pane])) + return; // handle incorrect mouseleave trigger, like when over a SELECT-list in IE + else if (evt) // trigger = mouseleave - use a delay + // 1 sec delay if 'opening', else .3 sec + timer.set(pane+"_closeSlider", close_NOW, max(o.slideDelay_close, delay)); + else // called programically + close_NOW(); + + /** + * SUBROUTINE for timed close + */ + function close_NOW () { + if (s.isClosed) // skip 'close' if already closed! + bindStopSlidingEvents(pane, false); // UNBIND trigger events - TODO: is this needed here? + else if (!s.isMoving) + close(pane); // close will handle unbinding + }; + } + + /** + * @param {string} pane The pane being opened, ie: north, south, east, or west + */ +, slideToggle = function (evt_or_pane) { + var pane = evtPane.call(this, evt_or_pane); + toggle(pane, true); + } + + + /** + * Must set left/top on East/South panes so animation will work properly + * + * @param {string} pane The pane to lock, 'east' or 'south' - any other is ignored! + * @param {boolean} doLock true = set left/top, false = remove + */ +, lockPaneForFX = function (pane, doLock) { + var $P = $Ps[pane] + , s = state[pane] + , o = options[pane] + , z = options.zIndexes + ; + if (doLock) { + $P.css({ zIndex: z.pane_animate }); // overlay all elements during animation + if (pane=="south") + $P.css({ top: sC.insetTop + sC.innerHeight - $P.outerHeight() }); + else if (pane=="east") + $P.css({ left: sC.insetLeft + sC.innerWidth - $P.outerWidth() }); + } + else { // animation DONE - RESET CSS + // TODO: see if this can be deleted. It causes a quick-close when sliding in Chrome + $P.css({ zIndex: (s.isSliding ? z.pane_sliding : z.pane_normal) }); + if (pane=="south") + $P.css({ top: "auto" }); + // if pane is positioned 'off-screen', then DO NOT screw with it! + else if (pane=="east" && !$P.css("left").match(/\-99999/)) + $P.css({ left: "auto" }); + // fix anti-aliasing in IE - only needed for animations that change opacity + if (browser.msie && o.fxOpacityFix && o.fxName_open != "slide" && $P.css("filter") && $P.css("opacity") == 1) + $P[0].style.removeAttribute('filter'); + } + } + + + /** + * Toggle sliding functionality of a specific pane on/off by adding removing 'slide open' trigger + * + * @see open(), close() + * @param {string} pane The pane to enable/disable, 'north', 'south', etc. + * @param {boolean} enable Enable or Disable sliding? + */ +, bindStartSlidingEvent = function (pane, enable) { + var o = options[pane] + , $P = $Ps[pane] + , $R = $Rs[pane] + , evtName = o.slideTrigger_open.toLowerCase() + ; + if (!$R || (enable && !o.slidable)) return; + + // make sure we have a valid event + if (evtName.match(/mouseover/)) + evtName = o.slideTrigger_open = "mouseenter"; + else if (!evtName.match(/click|dblclick|mouseenter/)) + evtName = o.slideTrigger_open = "click"; + + $R + // add or remove event + [enable ? "bind" : "unbind"](evtName +'.'+ sID, slideOpen) + // set the appropriate cursor & title/tip + .css("cursor", enable ? o.sliderCursor : "default") + .attr("title", enable ? o.sliderTip : "") + ; + } + + /** + * Add or remove 'mouseleave' events to 'slide close' when pane is 'sliding' open or closed + * Also increases zIndex when pane is sliding open + * See bindStartSlidingEvent for code to control 'slide open' + * + * @see slideOpen(), slideClose() + * @param {string} pane The pane to process, 'north', 'south', etc. + * @param {boolean} enable Enable or Disable events? + */ +, bindStopSlidingEvents = function (pane, enable) { + var o = options[pane] + , s = state[pane] + , c = _c[pane] + , z = options.zIndexes + , evtName = o.slideTrigger_close.toLowerCase() + , action = (enable ? "bind" : "unbind") + , $P = $Ps[pane] + , $R = $Rs[pane] + ; + s.isSliding = enable; // logic + timer.clear(pane+"_closeSlider"); // just in case + + // remove 'slideOpen' event from resizer + // ALSO will raise the zIndex of the pane & resizer + if (enable) bindStartSlidingEvent(pane, false); + + // RE/SET zIndex - increases when pane is sliding-open, resets to normal when not + $P.css("zIndex", enable ? z.pane_sliding : z.pane_normal); + $R.css("zIndex", enable ? z.pane_sliding+2 : z.resizer_normal); // NOTE: mask = pane_sliding+1 + + // make sure we have a valid event + if (!evtName.match(/click|mouseleave/)) + evtName = o.slideTrigger_close = "mouseleave"; // also catches 'mouseout' + + // add/remove slide triggers + $R[action](evtName, slideClose); // base event on resize + // need extra events for mouseleave + if (evtName === "mouseleave") { + // also close on pane.mouseleave + $P[action]("mouseleave."+ sID, slideClose); + // cancel timer when mouse moves between 'pane' and 'resizer' + $R[action]("mouseenter."+ sID, cancelMouseOut); + $P[action]("mouseenter."+ sID, cancelMouseOut); + } + + if (!enable) + timer.clear(pane+"_closeSlider"); + else if (evtName === "click" && !o.resizable) { + // IF pane is not resizable (which already has a cursor and tip) + // then set the a cursor & title/tip on resizer when sliding + $R.css("cursor", enable ? o.sliderCursor : "default"); + $R.attr("title", enable ? o.togglerTip_open : ""); // use Toggler-tip, eg: "Close Pane" + } + + // SUBROUTINE for mouseleave timer clearing + function cancelMouseOut (evt) { + timer.clear(pane+"_closeSlider"); + evt.stopPropagation(); + } + } + + + /** + * Hides/closes a pane if there is insufficient room - reverses this when there is room again + * MUST have already called setSizeLimits() before calling this method + * + * @param {string} pane The pane being resized + * @param {boolean=} [isOpening=false] Called from onOpen? + * @param {boolean=} [skipCallback=false] Should the onresize callback be run? + * @param {boolean=} [force=false] + */ +, makePaneFit = function (pane, isOpening, skipCallback, force) { + var + o = options[pane] + , s = state[pane] + , c = _c[pane] + , $P = $Ps[pane] + , $R = $Rs[pane] + , isSidePane = c.dir==="vert" + , hasRoom = false + ; + // special handling for center & east/west panes + if (pane === "center" || (isSidePane && s.noVerticalRoom)) { + // see if there is enough room to display the pane + // ERROR: hasRoom = s.minHeight <= s.maxHeight && (isSidePane || s.minWidth <= s.maxWidth); + hasRoom = (s.maxHeight >= 0); + if (hasRoom && s.noRoom) { // previously hidden due to noRoom, so show now + _showPane(pane); + if ($R) $R.show(); + s.isVisible = true; + s.noRoom = false; + if (isSidePane) s.noVerticalRoom = false; + _fixIframe(pane); + } + else if (!hasRoom && !s.noRoom) { // not currently hidden, so hide now + _hidePane(pane); + if ($R) $R.hide(); + s.isVisible = false; + s.noRoom = true; + } + } + + // see if there is enough room to fit the border-pane + if (pane === "center") { + // ignore center in this block + } + else if (s.minSize <= s.maxSize) { // pane CAN fit + hasRoom = true; + if (s.size > s.maxSize) // pane is too big - shrink it + sizePane(pane, s.maxSize, skipCallback, force, true); // true = noAnimation + else if (s.size < s.minSize) // pane is too small - enlarge it + sizePane(pane, s.minSize, skipCallback, force, true); + // need s.isVisible because new pseudoClose method keeps pane visible, but off-screen + else if ($R && s.isVisible && $P.is(":visible")) { + // make sure resizer-bar is positioned correctly + // handles situation where nested layout was 'hidden' when initialized + var side = c.side.toLowerCase() + , pos = s.size + sC["inset"+ c.side] + ; + if ($.layout.cssNum($R, side) != pos) $R.css( side, pos ); + } + + // if was previously hidden due to noRoom, then RESET because NOW there is room + if (s.noRoom) { + // s.noRoom state will be set by open or show + if (s.wasOpen && o.closable) { + if (o.autoReopen) + open(pane, false, true, true); // true = noAnimation, true = noAlert + else // leave the pane closed, so just update state + s.noRoom = false; + } + else + show(pane, s.wasOpen, true, true); // true = noAnimation, true = noAlert + } + } + else { // !hasRoom - pane CANNOT fit + if (!s.noRoom) { // pane not set as noRoom yet, so hide or close it now... + s.noRoom = true; // update state + s.wasOpen = !s.isClosed && !s.isSliding; + if (s.isClosed){} // SKIP + else if (o.closable) // 'close' if possible + close(pane, true, true); // true = force, true = noAnimation + else // 'hide' pane if cannot just be closed + hide(pane, true); // true = noAnimation + } + } + } + + + /** + * sizePane / manualSizePane + * sizePane is called only by internal methods whenever a pane needs to be resized + * manualSizePane is an exposed flow-through method allowing extra code when pane is 'manually resized' + * + * @param {string} pane The pane being resized + * @param {number} size The *desired* new size for this pane - will be validated + * @param {boolean=} [skipCallback=false] Should the onresize callback be run? + * @param {boolean=} [noAnimation=false] + */ +, manualSizePane = function (evt_or_pane, size, skipCallback, noAnimation) { + if (!isInitialized()) return; + var pane = evtPane.call(this, evt_or_pane) + , o = options[pane] + , s = state[pane] + // if resizing callbacks have been delayed and resizing is now DONE, force resizing to complete... + , forceResize = o.livePaneResizing && !s.isResizing + ; + // ANY call to manualSizePane disables autoResize - ie, percentage sizing + o.autoResize = false; + // flow-through... + sizePane(pane, size, skipCallback, forceResize, noAnimation); // will animate resize if option enabled + } + + /** + * @param {string} pane The pane being resized + * @param {number} size The *desired* new size for this pane - will be validated + * @param {boolean=} [skipCallback=false] Should the onresize callback be run? + * @param {boolean=} [force=false] Force resizing even if does not seem necessary + * @param {boolean=} [noAnimation=false] + */ +, sizePane = function (evt_or_pane, size, skipCallback, force, noAnimation) { + if (!isInitialized()) return; + var pane = evtPane.call(this, evt_or_pane) // probably NEVER called from event? + , o = options[pane] + , s = state[pane] + , $P = $Ps[pane] + , $R = $Rs[pane] + , side = _c[pane].side.toLowerCase() + , dimName = _c[pane].sizeType.toLowerCase() + , inset = "inset"+ _c[pane].side + , skipResizeWhileDragging = s.isResizing && !o.triggerEventsDuringLiveResize + , doFX = noAnimation !== true && o.animatePaneSizing + , oldSize, newSize + ; + // QUEUE in case another action/animation is in progress + $N.queue(function( queueNext ){ + // calculate 'current' min/max sizes + setSizeLimits(pane); // update pane-state + oldSize = s.size; + size = _parseSize(pane, size); // handle percentages & auto + size = max(size, _parseSize(pane, o.minSize)); + size = min(size, s.maxSize); + if (size < s.minSize) { // not enough room for pane! + queueNext(); // call before makePaneFit() because it needs the queue free + makePaneFit(pane, false, skipCallback); // will hide or close pane + return; + } + + // IF newSize is same as oldSize, then nothing to do - abort + if (!force && size === oldSize) + return queueNext(); + + // onresize_start callback CANNOT cancel resizing because this would break the layout! + if (!skipCallback && state.initialized && s.isVisible) + _runCallbacks("onresize_start", pane); + + // resize the pane, and make sure its visible + newSize = cssSize(pane, size); + + if (doFX && $P.is(":visible")) { // ANIMATE + var fx = $.layout.effects.size[pane] || $.layout.effects.size.all + , easing = o.fxSettings_size.easing || fx.easing + , z = options.zIndexes + , props = {}; + props[ dimName ] = newSize +'px'; + s.isMoving = true; + // overlay all elements during animation + $P.css({ zIndex: z.pane_animate }) + .show().animate( props, o.fxSpeed_size, easing, function(){ + // reset zIndex after animation + $P.css({ zIndex: (s.isSliding ? z.pane_sliding : z.pane_normal) }); + s.isMoving = false; + sizePane_2(); // continue + queueNext(); + }); + } + else { // no animation + $P.css( dimName, newSize ); // resize pane + // if pane is visible, then + if ($P.is(":visible")) + sizePane_2(); // continue + else { + // pane is NOT VISIBLE, so just update state data... + // when pane is *next opened*, it will have the new size + s.size = size; // update state.size + $.extend(s, elDims($P)); // update state dimensions + } + queueNext(); + }; + + }); + + // SUBROUTINE + function sizePane_2 () { + /* Panes are sometimes not sized precisely in some browsers!? + * This code will resize the pane up to 3 times to nudge the pane to the correct size + */ + var actual = dimName==='width' ? $P.outerWidth() : $P.outerHeight() + , tries = [{ + pane: pane + , count: 1 + , target: size + , actual: actual + , correct: (size === actual) + , attempt: size + , cssSize: newSize + }] + , lastTry = tries[0] + , msg = 'Inaccurate size after resizing the '+ pane +'-pane.' + ; + while ( !lastTry.correct ) { + thisTry = { pane: pane, count: lastTry.count+1, target: size }; + + if (lastTry.actual > size) + thisTry.attempt = max(0, lastTry.attempt - (lastTry.actual - size)); + else // lastTry.actual < size + thisTry.attempt = max(0, lastTry.attempt + (size - lastTry.actual)); + + thisTry.cssSize = cssSize(pane, thisTry.attempt); + $P.css( dimName, thisTry.cssSize ); + + thisTry.actual = dimName=='width' ? $P.outerWidth() : $P.outerHeight(); + thisTry.correct = (size === thisTry.actual); + + // if showDebugMessages, log attempts and alert the user of this *non-fatal error* + if (options.showDebugMessages) { + if ( tries.length === 1) { + _log(msg, false); + _log(lastTry, false); + } + _log(thisTry, false); + } + + // after 4 tries, is as close as its gonna get! + if (tries.length > 3) break; + + tries.push( thisTry ); + lastTry = tries[ tries.length - 1 ]; + } + // END TESTING CODE + + // update pane-state dimensions + s.size = size; + $.extend(s, elDims($P)); + + if (s.isVisible && $P.is(":visible")) { + // reposition the resizer-bar + if ($R) $R.css( side, size + sC[inset] ); + // resize the content-div + sizeContent(pane); + } + + if (!skipCallback && !skipResizeWhileDragging && state.initialized && s.isVisible) + _runCallbacks("onresize_end", pane); + + // resize all the adjacent panes, and adjust their toggler buttons + // when skipCallback passed, it means the controlling method will handle 'other panes' + if (!skipCallback) { + // also no callback if live-resize is in progress and NOT triggerEventsDuringLiveResize + if (!s.isSliding) sizeMidPanes(_c[pane].dir=="horz" ? "" : "center", skipResizeWhileDragging, force); + sizeHandles(); + } + + // if opposite-pane was autoClosed, see if it can be autoOpened now + var altPane = _c.oppositeEdge[pane]; + if (size < oldSize && state[ altPane ].noRoom) { + setSizeLimits( altPane ); + makePaneFit( altPane, false, skipCallback ); + } + + // DEBUG - ALERT user/developer so they know there was a sizing problem + if (options.showDebugMessages && tries.length > 1) + _log(msg +'\nSee the Error Console for details.', true); + } + } + + /** + * @see initPanes(), sizePane(), resizeAll(), open(), close(), hide() + * @param {string} panes The pane(s) being resized, comma-delmited string + * @param {boolean=} [skipCallback=false] Should the onresize callback be run? + * @param {boolean=} [force=false] + */ +, sizeMidPanes = function (panes, skipCallback, force) { + panes = (panes ? panes : "east,west,center").split(","); + + $.each(panes, function (i, pane) { + if (!$Ps[pane]) return; // NO PANE - skip + var + o = options[pane] + , s = state[pane] + , $P = $Ps[pane] + , $R = $Rs[pane] + , isCenter= (pane=="center") + , hasRoom = true + , CSS = {} + , newCenter = calcNewCenterPaneDims() + ; + // update pane-state dimensions + $.extend(s, elDims($P)); + + if (pane === "center") { + if (!force && s.isVisible && newCenter.width === s.outerWidth && newCenter.height === s.outerHeight) + return true; // SKIP - pane already the correct size + // set state for makePaneFit() logic + $.extend(s, cssMinDims(pane), { + maxWidth: newCenter.width + , maxHeight: newCenter.height + }); + CSS = newCenter; + // convert OUTER width/height to CSS width/height + CSS.width = cssW($P, CSS.width); + // NEW - allow pane to extend 'below' visible area rather than hide it + CSS.height = cssH($P, CSS.height); + hasRoom = CSS.width >= 0 && CSS.height >= 0; // height >= 0 = ALWAYS TRUE NOW + // during layout init, try to shrink east/west panes to make room for center + if (!state.initialized && o.minWidth > s.outerWidth) { + var + reqPx = o.minWidth - s.outerWidth + , minE = options.east.minSize || 0 + , minW = options.west.minSize || 0 + , sizeE = state.east.size + , sizeW = state.west.size + , newE = sizeE + , newW = sizeW + ; + if (reqPx > 0 && state.east.isVisible && sizeE > minE) { + newE = max( sizeE-minE, sizeE-reqPx ); + reqPx -= sizeE-newE; + } + if (reqPx > 0 && state.west.isVisible && sizeW > minW) { + newW = max( sizeW-minW, sizeW-reqPx ); + reqPx -= sizeW-newW; + } + // IF we found enough extra space, then resize the border panes as calculated + if (reqPx === 0) { + if (sizeE != minE) + sizePane('east', newE, true, force, true); // true = skipCallback/noAnimation - initPanes will handle when done + if (sizeW != minW) + sizePane('west', newW, true, force, true); + // now start over! + sizeMidPanes('center', skipCallback, force); + return; // abort this loop + } + } + } + else { // for east and west, set only the height, which is same as center height + // set state.min/maxWidth/Height for makePaneFit() logic + if (s.isVisible && !s.noVerticalRoom) + $.extend(s, elDims($P), cssMinDims(pane)) + if (!force && !s.noVerticalRoom && newCenter.height === s.outerHeight) + return true; // SKIP - pane already the correct size + // east/west have same top, bottom & height as center + CSS.top = newCenter.top; + CSS.bottom = newCenter.bottom; + // NEW - allow pane to extend 'below' visible area rather than hide it + CSS.height = cssH($P, newCenter.height); + s.maxHeight = CSS.height; + hasRoom = (s.maxHeight >= 0); // ALWAYS TRUE NOW + if (!hasRoom) s.noVerticalRoom = true; // makePaneFit() logic + } + + if (hasRoom) { + // resizeAll passes skipCallback because it triggers callbacks after ALL panes are resized + if (!skipCallback && state.initialized) + _runCallbacks("onresize_start", pane); + + $P.css(CSS); // apply the CSS to pane + sizeHandles(pane); // also update resizer length + if (s.noRoom && !s.isClosed && !s.isHidden) + makePaneFit(pane); // will re-open/show auto-closed/hidden pane + if (s.isVisible) { + $.extend(s, elDims($P)); // update pane dimensions + if (state.initialized) sizeContent(pane); // also resize the contents, if exists + } + } + else if (!s.noRoom && s.isVisible) // no room for pane + makePaneFit(pane); // will hide or close pane + + if (!s.isVisible) + return true; // DONE - next pane + + /* + * Extra CSS for IE6 or IE7 in Quirks-mode - add 'width' to NORTH/SOUTH panes + * Normally these panes have only 'left' & 'right' positions so pane auto-sizes + * ALSO required when pane is an IFRAME because will NOT default to 'full width' + */ + if (pane === "center") { // finished processing midPanes + var b = $.layout.browser; + var fix = b.isIE6 || (b.msie && !$.support.boxModel); + if ($Ps.north && (fix || state.north.tagName=="IFRAME")) + $Ps.north.css("width", cssW($Ps.north, sC.innerWidth)); + if ($Ps.south && (fix || state.south.tagName=="IFRAME")) + $Ps.south.css("width", cssW($Ps.south, sC.innerWidth)); + } + + // resizeAll passes skipCallback because it triggers callbacks after ALL panes are resized + if (!skipCallback && state.initialized) + _runCallbacks("onresize_end", pane); + }); + } + + + /** + * @see window.onresize(), callbacks or custom code + */ +, resizeAll = function () { + if (!state.initialized) { + _initLayoutElements(); + return; // no need to resize since we just initialized! + } + var oldW = sC.innerWidth + , oldH = sC.innerHeight + ; + // cannot size layout when 'container' is hidden or collapsed + if (!$N.is(":visible:") ) return; + $.extend( state.container, elDims( $N ) ); // UPDATE container dimensions + if (!sC.outerHeight) return; + + // onresizeall_start will CANCEL resizing if returns false + // state.container has already been set, so user can access this info for calcuations + if (false === _runCallbacks("onresizeall_start")) return false; + + var // see if container is now 'smaller' than before + shrunkH = (sC.innerHeight < oldH) + , shrunkW = (sC.innerWidth < oldW) + , $P, o, s, dir + ; + // NOTE special order for sizing: S-N-E-W + $.each(["south","north","east","west"], function (i, pane) { + if (!$Ps[pane]) return; // no pane - SKIP + s = state[pane]; + o = options[pane]; + dir = _c[pane].dir; + + if (o.autoResize && s.size != o.size) // resize pane to original size set in options + sizePane(pane, o.size, true, true, true); // true=skipCallback/forceResize/noAnimation + else { + setSizeLimits(pane); + makePaneFit(pane, false, true, true); // true=skipCallback/forceResize + } + }); + + sizeMidPanes("", true, true); // true=skipCallback, true=forceResize + sizeHandles(); // reposition the toggler elements + + // trigger all individual pane callbacks AFTER layout has finished resizing + o = options; // reuse alias + $.each(_c.allPanes, function (i, pane) { + $P = $Ps[pane]; + if (!$P) return; // SKIP + if (state[pane].isVisible) // undefined for non-existent panes + _runCallbacks("onresize_end", pane); // callback - if exists + }); + + _runCallbacks("onresizeall_end"); + //_triggerLayoutEvent(pane, 'resizeall'); + } + + /** + * Whenever a pane resizes or opens that has a nested layout, trigger resizeAll + * + * @param {string} pane The pane just resized or opened + */ +, resizeChildLayout = function (evt_or_pane) { + var pane = evtPane.call(this, evt_or_pane); + if (!options[pane].resizeChildLayout) return; + var $P = $Ps[pane] + , $C = $Cs[pane] + , d = "layout" + , P = Instance[pane] + , L = children[pane] + ; + // user may have manually set EITHER instance pointer, so handle that + if (P.child && !L) { + // have to reverse the pointers! + var el = P.child.container; + L = children[pane] = (el ? el.data(d) : 0) || null; // set pointer _directly_ to layout instance + } + + // if a layout-pointer exists, see if child has been destroyed + if (L && L.destroyed) + L = children[pane] = null; // clear child pointers + // no child layout pointer is set - see if there is a child layout NOW + if (!L) L = children[pane] = $P.data(d) || ($C ? $C.data(d) : 0) || null; // set/update child pointers + + // ALWAYS refresh the pane.child alias + P.child = children[pane]; + + if (L) L.resizeAll(); + } + + + /** + * IF pane has a content-div, then resize all elements inside pane to fit pane-height + * + * @param {string=} [panes=""] The pane(s) being resized + * @param {boolean=} [remeasure=false] Should the content (header/footer) be remeasured? + */ +, sizeContent = function (evt_or_panes, remeasure) { + if (!isInitialized()) return; + + var panes = evtPane.call(this, evt_or_panes); + panes = panes ? panes.split(",") : _c.allPanes; + + $.each(panes, function (idx, pane) { + var + $P = $Ps[pane] + , $C = $Cs[pane] + , o = options[pane] + , s = state[pane] + , m = s.content // m = measurements + ; + if (!$P || !$C || !$P.is(":visible")) return true; // NOT VISIBLE - skip + + // if content-element was REMOVED, update OR remove the pointer + if (!$C.length) { + initContent(pane, false); // false = do NOT sizeContent() - already there! + if (!$C) return; // no replacement element found - pointer have been removed + } + + // onsizecontent_start will CANCEL resizing if returns false + if (false === _runCallbacks("onsizecontent_start", pane)) return; + + // skip re-measuring offsets if live-resizing + if ((!s.isMoving && !s.isResizing) || o.liveContentResizing || remeasure || m.top == undefined) { + _measure(); + // if any footers are below pane-bottom, they may not measure correctly, + // so allow pane overflow and re-measure + if (m.hiddenFooters > 0 && $P.css("overflow") === "hidden") { + $P.css("overflow", "visible"); + _measure(); // remeasure while overflowing + $P.css("overflow", "hidden"); + } + } + // NOTE: spaceAbove/Below *includes* the pane paddingTop/Bottom, but not pane.borders + var newH = s.innerHeight - (m.spaceAbove - s.css.paddingTop) - (m.spaceBelow - s.css.paddingBottom); + + if (!$C.is(":visible") || m.height != newH) { + // size the Content element to fit new pane-size - will autoHide if not enough room + setOuterHeight($C, newH, true); // true=autoHide + m.height = newH; // save new height + }; + + if (state.initialized) + _runCallbacks("onsizecontent_end", pane); + + function _below ($E) { + return max(s.css.paddingBottom, (parseInt($E.css("marginBottom"), 10) || 0)); + }; + + function _measure () { + var + ignore = options[pane].contentIgnoreSelector + , $Fs = $C.nextAll().not(ignore || ':lt(0)') // not :lt(0) = ALL + , $Fs_vis = $Fs.filter(':visible') + , $F = $Fs_vis.filter(':last') + ; + m = { + top: $C[0].offsetTop + , height: $C.outerHeight() + , numFooters: $Fs.length + , hiddenFooters: $Fs.length - $Fs_vis.length + , spaceBelow: 0 // correct if no content footer ($E) + } + m.spaceAbove = m.top; // just for state - not used in calc + m.bottom = m.top + m.height; + if ($F.length) + //spaceBelow = (LastFooter.top + LastFooter.height) [footerBottom] - Content.bottom + max(LastFooter.marginBottom, pane.paddingBotom) + m.spaceBelow = ($F[0].offsetTop + $F.outerHeight()) - m.bottom + _below($F); + else // no footer - check marginBottom on Content element itself + m.spaceBelow = _below($C); + }; + }); + } + + + /** + * Called every time a pane is opened, closed, or resized to slide the togglers to 'center' and adjust their length if necessary + * + * @see initHandles(), open(), close(), resizeAll() + * @param {string=} [panes=""] The pane(s) being resized + */ +, sizeHandles = function (evt_or_panes) { + var panes = evtPane.call(this, evt_or_panes) + panes = panes ? panes.split(",") : _c.borderPanes; + + $.each(panes, function (i, pane) { + var + o = options[pane] + , s = state[pane] + , $P = $Ps[pane] + , $R = $Rs[pane] + , $T = $Ts[pane] + , $TC + ; + if (!$P || !$R) return; + + var + dir = _c[pane].dir + , _state = (s.isClosed ? "_closed" : "_open") + , spacing = o["spacing"+ _state] + , togAlign = o["togglerAlign"+ _state] + , togLen = o["togglerLength"+ _state] + , paneLen + , left + , offset + , CSS = {} + ; + + if (spacing === 0) { + $R.hide(); + return; + } + else if (!s.noRoom && !s.isHidden) // skip if resizer was hidden for any reason + $R.show(); // in case was previously hidden + + // Resizer Bar is ALWAYS same width/height of pane it is attached to + if (dir === "horz") { // north/south + //paneLen = $P.outerWidth(); // s.outerWidth || + paneLen = sC.innerWidth; // handle offscreen-panes + s.resizerLength = paneLen; + left = $.layout.cssNum($P, "left") + $R.css({ + width: cssW($R, paneLen) // account for borders & padding + , height: cssH($R, spacing) // ditto + , left: left > -9999 ? left : sC.insetLeft // handle offscreen-panes + }); + } + else { // east/west + paneLen = $P.outerHeight(); // s.outerHeight || + s.resizerLength = paneLen; + $R.css({ + height: cssH($R, paneLen) // account for borders & padding + , width: cssW($R, spacing) // ditto + , top: sC.insetTop + getPaneSize("north", true) // TODO: what if no North pane? + //, top: $.layout.cssNum($Ps["center"], "top") + }); + } + + // remove hover classes + removeHover( o, $R ); + + if ($T) { + if (togLen === 0 || (s.isSliding && o.hideTogglerOnSlide)) { + $T.hide(); // always HIDE the toggler when 'sliding' + return; + } + else + $T.show(); // in case was previously hidden + + if (!(togLen > 0) || togLen === "100%" || togLen > paneLen) { + togLen = paneLen; + offset = 0; + } + else { // calculate 'offset' based on options.PANE.togglerAlign_open/closed + if (isStr(togAlign)) { + switch (togAlign) { + case "top": + case "left": offset = 0; + break; + case "bottom": + case "right": offset = paneLen - togLen; + break; + case "middle": + case "center": + default: offset = round((paneLen - togLen) / 2); // 'default' catches typos + } + } + else { // togAlign = number + var x = parseInt(togAlign, 10); // + if (togAlign >= 0) offset = x; + else offset = paneLen - togLen + x; // NOTE: x is negative! + } + } + + if (dir === "horz") { // north/south + var width = cssW($T, togLen); + $T.css({ + width: width // account for borders & padding + , height: cssH($T, spacing) // ditto + , left: offset // TODO: VERIFY that toggler positions correctly for ALL values + , top: 0 + }); + // CENTER the toggler content SPAN + $T.children(".content").each(function(){ + $TC = $(this); + $TC.css("marginLeft", round((width-$TC.outerWidth())/2)); // could be negative + }); + } + else { // east/west + var height = cssH($T, togLen); + $T.css({ + height: height // account for borders & padding + , width: cssW($T, spacing) // ditto + , top: offset // POSITION the toggler + , left: 0 + }); + // CENTER the toggler content SPAN + $T.children(".content").each(function(){ + $TC = $(this); + $TC.css("marginTop", round((height-$TC.outerHeight())/2)); // could be negative + }); + } + + // remove ALL hover classes + removeHover( 0, $T ); + } + + // DONE measuring and sizing this resizer/toggler, so can be 'hidden' now + if (!state.initialized && (o.initHidden || s.noRoom)) { + $R.hide(); + if ($T) $T.hide(); + } + }); + } + + + /** + * @param {string} pane + */ +, enableClosable = function (evt_or_pane) { + if (!isInitialized()) return; + var pane = evtPane.call(this, evt_or_pane) + , $T = $Ts[pane] + , o = options[pane] + ; + if (!$T) return; + o.closable = true; + $T .bind("click."+ sID, function(evt){ evt.stopPropagation(); toggle(pane); }) + .css("visibility", "visible") + .css("cursor", "pointer") + .attr("title", state[pane].isClosed ? o.togglerTip_closed : o.togglerTip_open) // may be blank + .show(); + } + /** + * @param {string} pane + * @param {boolean=} [hide=false] + */ +, disableClosable = function (evt_or_pane, hide) { + if (!isInitialized()) return; + var pane = evtPane.call(this, evt_or_pane) + , $T = $Ts[pane] + ; + if (!$T) return; + options[pane].closable = false; + // is closable is disable, then pane MUST be open! + if (state[pane].isClosed) open(pane, false, true); + $T .unbind("."+ sID) + .css("visibility", hide ? "hidden" : "visible") // instead of hide(), which creates logic issues + .css("cursor", "default") + .attr("title", ""); + } + + + /** + * @param {string} pane + */ +, enableSlidable = function (evt_or_pane) { + if (!isInitialized()) return; + var pane = evtPane.call(this, evt_or_pane) + , $R = $Rs[pane] + ; + if (!$R || !$R.data('draggable')) return; + options[pane].slidable = true; + if (s.isClosed) + bindStartSlidingEvent(pane, true); + } + /** + * @param {string} pane + */ +, disableSlidable = function (evt_or_pane) { + if (!isInitialized()) return; + var pane = evtPane.call(this, evt_or_pane) + , $R = $Rs[pane] + ; + if (!$R) return; + options[pane].slidable = false; + if (state[pane].isSliding) + close(pane, false, true); + else { + bindStartSlidingEvent(pane, false); + $R .css("cursor", "default") + .attr("title", ""); + removeHover(null, $R[0]); // in case currently hovered + } + } + + + /** + * @param {string} pane + */ +, enableResizable = function (evt_or_pane) { + if (!isInitialized()) return; + var pane = evtPane.call(this, evt_or_pane) + , $R = $Rs[pane] + , o = options[pane] + ; + if (!$R || !$R.data('draggable')) return; + o.resizable = true; + $R.draggable("enable"); + if (!state[pane].isClosed) + $R .css("cursor", o.resizerCursor) + .attr("title", o.resizerTip); + } + /** + * @param {string} pane + */ +, disableResizable = function (evt_or_pane) { + if (!isInitialized()) return; + var pane = evtPane.call(this, evt_or_pane) + , $R = $Rs[pane] + ; + if (!$R || !$R.data('draggable')) return; + options[pane].resizable = false; + $R .draggable("disable") + .css("cursor", "default") + .attr("title", ""); + removeHover(null, $R[0]); // in case currently hovered + } + + + /** + * Move a pane from source-side (eg, west) to target-side (eg, east) + * If pane exists on target-side, move that to source-side, ie, 'swap' the panes + * + * @param {string} pane1 The pane/edge being swapped + * @param {string} pane2 ditto + */ +, swapPanes = function (evt_or_pane1, pane2) { + if (!isInitialized()) return; + var pane1 = evtPane.call(this, evt_or_pane1); + // change state.edge NOW so callbacks can know where pane is headed... + state[pane1].edge = pane2; + state[pane2].edge = pane1; + // run these even if NOT state.initialized + if (false === _runCallbacks("onswap_start", pane1) + || false === _runCallbacks("onswap_start", pane2) + ) { + state[pane1].edge = pane1; // reset + state[pane2].edge = pane2; + return; + } + + var + oPane1 = copy( pane1 ) + , oPane2 = copy( pane2 ) + , sizes = {} + ; + sizes[pane1] = oPane1 ? oPane1.state.size : 0; + sizes[pane2] = oPane2 ? oPane2.state.size : 0; + + // clear pointers & state + $Ps[pane1] = false; + $Ps[pane2] = false; + state[pane1] = {}; + state[pane2] = {}; + + // ALWAYS remove the resizer & toggler elements + if ($Ts[pane1]) $Ts[pane1].remove(); + if ($Ts[pane2]) $Ts[pane2].remove(); + if ($Rs[pane1]) $Rs[pane1].remove(); + if ($Rs[pane2]) $Rs[pane2].remove(); + $Rs[pane1] = $Rs[pane2] = $Ts[pane1] = $Ts[pane2] = false; + + // transfer element pointers and data to NEW Layout keys + move( oPane1, pane2 ); + move( oPane2, pane1 ); + + // cleanup objects + oPane1 = oPane2 = sizes = null; + + // make panes 'visible' again + if ($Ps[pane1]) $Ps[pane1].css(_c.visible); + if ($Ps[pane2]) $Ps[pane2].css(_c.visible); + + // fix any size discrepancies caused by swap + resizeAll(); + + // run these even if NOT state.initialized + _runCallbacks("onswap_end", pane1); + _runCallbacks("onswap_end", pane2); + + return; + + function copy (n) { // n = pane + var + $P = $Ps[n] + , $C = $Cs[n] + ; + return !$P ? false : { + pane: n + , P: $P ? $P[0] : false + , C: $C ? $C[0] : false + , state: $.extend(true, {}, state[n]) + , options: $.extend(true, {}, options[n]) + } + }; + + function move (oPane, pane) { + if (!oPane) return; + var + P = oPane.P + , C = oPane.C + , oldPane = oPane.pane + , c = _c[pane] + , side = c.side.toLowerCase() + , inset = "inset"+ c.side + // save pane-options that should be retained + , s = $.extend({}, state[pane]) + , o = options[pane] + // RETAIN side-specific FX Settings - more below + , fx = { resizerCursor: o.resizerCursor } + , re, size, pos + ; + $.each("fxName,fxSpeed,fxSettings".split(","), function (i, k) { + fx[k +"_open"] = o[k +"_open"]; + fx[k +"_close"] = o[k +"_close"]; + fx[k +"_size"] = o[k +"_size"]; + }); + + // update object pointers and attributes + $Ps[pane] = $(P) + .data({ + layoutPane: Instance[pane] // NEW pointer to pane-alias-object + , layoutEdge: pane + }) + .css(_c.hidden) + .css(c.cssReq) + ; + $Cs[pane] = C ? $(C) : false; + + // set options and state + options[pane] = $.extend({}, oPane.options, fx); + state[pane] = $.extend({}, oPane.state); + + // change classNames on the pane, eg: ui-layout-pane-east ==> ui-layout-pane-west + re = new RegExp(o.paneClass +"-"+ oldPane, "g"); + P.className = P.className.replace(re, o.paneClass +"-"+ pane); + + // ALWAYS regenerate the resizer & toggler elements + initHandles(pane); // create the required resizer & toggler + + // if moving to different orientation, then keep 'target' pane size + if (c.dir != _c[oldPane].dir) { + size = sizes[pane] || 0; + setSizeLimits(pane); // update pane-state + size = max(size, state[pane].minSize); + // use manualSizePane to disable autoResize - not useful after panes are swapped + manualSizePane(pane, size, true, true); // true/true = skipCallback/noAnimation + } + else // move the resizer here + $Rs[pane].css(side, sC[inset] + (state[pane].isVisible ? getPaneSize(pane) : 0)); + + + // ADD CLASSNAMES & SLIDE-BINDINGS + if (oPane.state.isVisible && !s.isVisible) + setAsOpen(pane, true); // true = skipCallback + else { + setAsClosed(pane); + bindStartSlidingEvent(pane, true); // will enable events IF option is set + } + + // DESTROY the object + oPane = null; + }; + } + + + /** + * INTERNAL method to sync pin-buttons when pane is opened or closed + * Unpinned means the pane is 'sliding' - ie, over-top of the adjacent panes + * + * @see open(), setAsOpen(), setAsClosed() + * @param {string} pane These are the params returned to callbacks by layout() + * @param {boolean} doPin True means set the pin 'down', False means 'up' + */ +, syncPinBtns = function (pane, doPin) { + if ($.layout.plugins.buttons) + $.each(state[pane].pins, function (i, selector) { + $.layout.buttons.setPinState(Instance, $(selector), pane, doPin); + }); + } + +; // END var DECLARATIONS + + /** + * Capture keys when enableCursorHotkey - toggle pane if hotkey pressed + * + * @see document.keydown() + */ + function keyDown (evt) { + if (!evt) return true; + var code = evt.keyCode; + if (code < 33) return true; // ignore special keys: ENTER, TAB, etc + + var + PANE = { + 38: "north" // Up Cursor - $.ui.keyCode.UP + , 40: "south" // Down Cursor - $.ui.keyCode.DOWN + , 37: "west" // Left Cursor - $.ui.keyCode.LEFT + , 39: "east" // Right Cursor - $.ui.keyCode.RIGHT + } + , ALT = evt.altKey // no worky! + , SHIFT = evt.shiftKey + , CTRL = evt.ctrlKey + , CURSOR = (CTRL && code >= 37 && code <= 40) + , o, k, m, pane + ; + + if (CURSOR && options[PANE[code]].enableCursorHotkey) // valid cursor-hotkey + pane = PANE[code]; + else if (CTRL || SHIFT) // check to see if this matches a custom-hotkey + $.each(_c.borderPanes, function (i, p) { // loop each pane to check its hotkey + o = options[p]; + k = o.customHotkey; + m = o.customHotkeyModifier; // if missing or invalid, treated as "CTRL+SHIFT" + if ((SHIFT && m=="SHIFT") || (CTRL && m=="CTRL") || (CTRL && SHIFT)) { // Modifier matches + if (k && code === (isNaN(k) || k <= 9 ? k.toUpperCase().charCodeAt(0) : k)) { // Key matches + pane = p; + return false; // BREAK + } + } + }); + + // validate pane + if (!pane || !$Ps[pane] || !options[pane].closable || state[pane].isHidden) + return true; + + toggle(pane); + + evt.stopPropagation(); + evt.returnValue = false; // CANCEL key + return false; + }; + + +/* + * ###################################### + * UTILITY METHODS + * called externally or by initButtons + * ###################################### + */ + + /** + * Change/reset a pane overflow setting & zIndex to allow popups/drop-downs to work + * + * @param {Object=} [el] (optional) Can also be 'bound' to a click, mouseOver, or other event + */ + function allowOverflow (el) { + if (!isInitialized()) return; + if (this && this.tagName) el = this; // BOUND to element + var $P; + if (isStr(el)) + $P = $Ps[el]; + else if ($(el).data("layoutRole")) + $P = $(el); + else + $(el).parents().each(function(){ + if ($(this).data("layoutRole")) { + $P = $(this); + return false; // BREAK + } + }); + if (!$P || !$P.length) return; // INVALID + + var + pane = $P.data("layoutEdge") + , s = state[pane] + ; + + // if pane is already raised, then reset it before doing it again! + // this would happen if allowOverflow is attached to BOTH the pane and an element + if (s.cssSaved) + resetOverflow(pane); // reset previous CSS before continuing + + // if pane is raised by sliding or resizing, or its closed, then abort + if (s.isSliding || s.isResizing || s.isClosed) { + s.cssSaved = false; + return; + } + + var + newCSS = { zIndex: (options.zIndexes.resizer_normal + 1) } + , curCSS = {} + , of = $P.css("overflow") + , ofX = $P.css("overflowX") + , ofY = $P.css("overflowY") + ; + // determine which, if any, overflow settings need to be changed + if (of != "visible") { + curCSS.overflow = of; + newCSS.overflow = "visible"; + } + if (ofX && !ofX.match(/visible|auto/)) { + curCSS.overflowX = ofX; + newCSS.overflowX = "visible"; + } + if (ofY && !ofY.match(/visible|auto/)) { + curCSS.overflowY = ofX; + newCSS.overflowY = "visible"; + } + + // save the current overflow settings - even if blank! + s.cssSaved = curCSS; + + // apply new CSS to raise zIndex and, if necessary, make overflow 'visible' + $P.css( newCSS ); + + // make sure the zIndex of all other panes is normal + $.each(_c.allPanes, function(i, p) { + if (p != pane) resetOverflow(p); + }); + + }; + /** + * @param {Object=} [el] (optional) Can also be 'bound' to a click, mouseOver, or other event + */ + function resetOverflow (el) { + if (!isInitialized()) return; + if (this && this.tagName) el = this; // BOUND to element + var $P; + if (isStr(el)) + $P = $Ps[el]; + else if ($(el).data("layoutRole")) + $P = $(el); + else + $(el).parents().each(function(){ + if ($(this).data("layoutRole")) { + $P = $(this); + return false; // BREAK + } + }); + if (!$P || !$P.length) return; // INVALID + + var + pane = $P.data("layoutEdge") + , s = state[pane] + , CSS = s.cssSaved || {} + ; + // reset the zIndex + if (!s.isSliding && !s.isResizing) + $P.css("zIndex", options.zIndexes.pane_normal); + + // reset Overflow - if necessary + $P.css( CSS ); + + // clear var + s.cssSaved = false; + }; + +/* + * ##################### + * CREATE/RETURN LAYOUT + * ##################### + */ + + // validate that container exists + var $N = $(this).eq(0); // FIRST matching Container element + if (!$N.length) { + if (options.showErrorMessages) + _log( lang.errContainerMissing, true ); + return null; + }; + + // Users retrieve Instance of a layout with: $N.layout() OR $N.data("layout") + // return the Instance-pointer if layout has already been initialized + if ($N.data("layoutContainer") && $N.data("layout")) + return $N.data("layout"); // cached pointer + + // init global vars + var + $Ps = {} // Panes x5 - set in initPanes() + , $Cs = {} // Content x5 - set in initPanes() + , $Rs = {} // Resizers x4 - set in initHandles() + , $Ts = {} // Togglers x4 - set in initHandles() + , $Ms = $([]) // Masks - up to 2 masks per pane (IFRAME + DIV) + // aliases for code brevity + , sC = state.container // alias for easy access to 'container dimensions' + , sID = state.id // alias for unique layout ID/namespace - eg: "layout435" + ; + + // create Instance object to expose data & option Properties, and primary action Methods + var Instance = { + // layout data + options: options // property - options hash + , state: state // property - dimensions hash + // object pointers + , container: $N // property - object pointers for layout container + , panes: $Ps // property - object pointers for ALL Panes: panes.north, panes.center + , contents: $Cs // property - object pointers for ALL Content: contents.north, contents.center + , resizers: $Rs // property - object pointers for ALL Resizers, eg: resizers.north + , togglers: $Ts // property - object pointers for ALL Togglers, eg: togglers.north + // border-pane open/close + , hide: hide // method - ditto + , show: show // method - ditto + , toggle: toggle // method - pass a 'pane' ("north", "west", etc) + , open: open // method - ditto + , close: close // method - ditto + , slideOpen: slideOpen // method - ditto + , slideClose: slideClose // method - ditto + , slideToggle: slideToggle // method - ditto + // pane actions + , setSizeLimits: setSizeLimits // method - pass a 'pane' - update state min/max data + , _sizePane: sizePane // method -intended for user by plugins only! + , sizePane: manualSizePane // method - pass a 'pane' AND an 'outer-size' in pixels or percent, or 'auto' + , sizeContent: sizeContent // method - pass a 'pane' + , swapPanes: swapPanes // method - pass TWO 'panes' - will swap them + // pane element methods + , initContent: initContent // method - ditto + , addPane: addPane // method - pass a 'pane' + , removePane: removePane // method - pass a 'pane' to remove from layout, add 'true' to delete the pane-elem + , createChildLayout: createChildLayout// method - pass a 'pane' and (optional) layout-options (OVERRIDES options[pane].childOptions + // special pane option setting + , enableClosable: enableClosable // method - pass a 'pane' + , disableClosable: disableClosable // method - ditto + , enableSlidable: enableSlidable // method - ditto + , disableSlidable: disableSlidable // method - ditto + , enableResizable: enableResizable // method - ditto + , disableResizable: disableResizable// method - ditto + // utility methods for panes + , allowOverflow: allowOverflow // utility - pass calling element (this) + , resetOverflow: resetOverflow // utility - ditto + // layout control + , destroy: destroy // method - no parameters + , initPanes: isInitialized // method - no parameters + , resizeAll: resizeAll // method - no parameters + // callback triggering + , runCallbacks: _runCallbacks // method - pass evtName & pane (if a pane-event), eg: trigger("onopen", "west") + // alias collections of options, state and children - created in addPane and extended elsewhere + , hasParentLayout: false // set by initContainer() + , children: children // pointers to child-layouts, eg: Instance.children["west"] + , north: false // alias group: { name: pane, pane: $Ps[pane], options: options[pane], state: state[pane], child: children[pane] } + , south: false // ditto + , west: false // ditto + , east: false // ditto + , center: false // ditto + }; + + // create the border layout NOW + if (_create() === 'cancel') // onload_start callback returned false to CANCEL layout creation + return null; + else // true OR false -- if layout-elements did NOT init (hidden or do not exist), can auto-init later + return Instance; // return the Instance object + +} + + + + +/** + * jquery.layout.state 1.0 + * $Date$ + * + * Copyright (c) 2010 + * Kevin Dalman (http://allpro.net) + * + * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html) + * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses. + * + * @dependancies: UI Layout 1.3.0.rc30.1 or higher + * @dependancies: $.ui.cookie (above) + * + * @support: http://groups.google.com/group/jquery-ui-layout + */ +/* + * State-management options stored in options.stateManagement, which includes a .cookie hash + * Default options saves ALL KEYS for ALL PANES, ie: pane.size, pane.isClosed, pane.isHidden + * + * // STATE/COOKIE OPTIONS + * @example $(el).layout({ + stateManagement: { + enabled: true + , stateKeys: "east.size,west.size,east.isClosed,west.isClosed" + , cookie: { name: "appLayout", path: "/" } + } + }) + * @example $(el).layout({ stateManagement__enabled: true }) // enable auto-state-management using cookies + * @example $(el).layout({ stateManagement__cookie: { name: "appLayout", path: "/" } }) + * @example $(el).layout({ stateManagement__cookie__name: "appLayout", stateManagement__cookie__path: "/" }) + * + * // STATE/COOKIE METHODS + * @example myLayout.saveCookie( "west.isClosed,north.size,south.isHidden", {expires: 7} ); + * @example myLayout.loadCookie(); + * @example myLayout.deleteCookie(); + * @example var JSON = myLayout.readState(); // CURRENT Layout State + * @example var JSON = myLayout.readCookie(); // SAVED Layout State (from cookie) + * @example var JSON = myLayout.state.stateData; // LAST LOADED Layout State (cookie saved in layout.state hash) + * + * CUSTOM STATE-MANAGEMENT (eg, saved in a database) + * @example var JSON = myLayout.readState( "west.isClosed,north.size,south.isHidden" ); + * @example myLayout.loadState( JSON ); + */ + +/** + * UI COOKIE UTILITY + * + * A $.cookie OR $.ui.cookie namespace *should be standard*, but until then... + * This creates $.ui.cookie so Layout does not need the cookie.jquery.js plugin + * NOTE: This utility is REQUIRED by the layout.state plugin + * + * Cookie methods in Layout are created as part of State Management + */ +if (!$.ui) $.ui = {}; +$.ui.cookie = { + + // cookieEnabled is not in DOM specs, but DOES works in all browsers,including IE6 + acceptsCookies: !!navigator.cookieEnabled + +, read: function (name) { + var + c = document.cookie + , cs = c ? c.split(';') : [] + , pair // loop var + ; + for (var i=0, n=cs.length; i < n; i++) { + pair = $.trim(cs[i]).split('='); // name=value pair + if (pair[0] == name) // found the layout cookie + return decodeURIComponent(pair[1]); + + } + return null; + } + +, write: function (name, val, cookieOpts) { + var + params = '' + , date = '' + , clear = false + , o = cookieOpts || {} + , x = o.expires + ; + if (x && x.toUTCString) + date = x; + else if (x === null || typeof x === 'number') { + date = new Date(); + if (x > 0) + date.setDate(date.getDate() + x); + else { + date.setFullYear(1970); + clear = true; + } + } + if (date) params += ';expires='+ date.toUTCString(); + if (o.path) params += ';path='+ o.path; + if (o.domain) params += ';domain='+ o.domain; + if (o.secure) params += ';secure'; + document.cookie = name +'='+ (clear ? "" : encodeURIComponent( val )) + params; // write or clear cookie + } + +, clear: function (name) { + $.ui.cookie.write(name, '', {expires: -1}); + } + +}; +// if cookie.jquery.js is not loaded, create an alias to replicate it +// this may be useful to other plugins or code dependent on that plugin +if (!$.cookie) $.cookie = function (k, v, o) { + var C = $.ui.cookie; + if (v === null) + C.clear(k); + else if (v === undefined) + return C.read(k); + else + C.write(k, v, o); +}; + + +// tell Layout that the state plugin is available +$.layout.plugins.stateManagement = true; + +// Add State-Management options to layout.defaults +$.layout.config.optionRootKeys.push("stateManagement"); +$.layout.defaults.stateManagement = { + enabled: false // true = enable state-management, even if not using cookies +, autoSave: true // Save a state-cookie when page exits? +, autoLoad: true // Load the state-cookie when Layout inits? + // List state-data to save - must be pane-specific +, stateKeys: "north.size,south.size,east.size,west.size,"+ + "north.isClosed,south.isClosed,east.isClosed,west.isClosed,"+ + "north.isHidden,south.isHidden,east.isHidden,west.isHidden" +, cookie: { + name: "" // If not specified, will use Layout.name, else just "Layout" + , domain: "" // blank = current domain + , path: "" // blank = current page, '/' = entire website + , expires: "" // 'days' to keep cookie - leave blank for 'session cookie' + , secure: false + } +}; +// Set stateManagement as a layout-option, NOT a pane-option +$.layout.optionsMap.layout.push("stateManagement"); + +/* + * State Management methods + */ +$.layout.state = { + + /** + * Get the current layout state and save it to a cookie + * + * myLayout.saveCookie( keys, cookieOpts ) + * + * @param {Object} inst + * @param {(string|Array)=} keys + * @param {Object=} opts + */ + saveCookie: function (inst, keys, cookieOpts) { + var o = inst.options + , oS = o.stateManagement + , oC = $.extend(true, {}, oS.cookie, cookieOpts || null) + , data = inst.state.stateData = inst.readState( keys || oS.stateKeys ) // read current panes-state + ; + $.ui.cookie.write( oC.name || o.name || "Layout", $.layout.state.encodeJSON(data), oC ); + return $.extend(true, {}, data); // return COPY of state.stateData data + } + + /** + * Remove the state cookie + * + * @param {Object} inst + */ +, deleteCookie: function (inst) { + var o = inst.options; + $.ui.cookie.clear( o.stateManagement.cookie.name || o.name || "Layout" ); + } + + /** + * Read & return data from the cookie - as JSON + * + * @param {Object} inst + */ +, readCookie: function (inst) { + var o = inst.options; + var c = $.ui.cookie.read( o.stateManagement.cookie.name || o.name || "Layout" ); + // convert cookie string back to a hash and return it + return c ? $.layout.state.decodeJSON(c) : {}; + } + + /** + * Get data from the cookie and USE IT to loadState + * + * @param {Object} inst + */ +, loadCookie: function (inst) { + var c = $.layout.state.readCookie(inst); // READ the cookie + if (c) { + inst.state.stateData = $.extend(true, {}, c); // SET state.stateData + inst.loadState(c); // LOAD the retrieved state + } + return c; + } + + /** + * Update layout options from the cookie, if one exists + * + * @param {Object} inst + * @param {Object=} stateData + * @param {boolean=} animate + */ +, loadState: function (inst, stateData, animate) { + stateData = $.layout.transformData( stateData ); // panes = default subkey + if ($.isEmptyObject( stateData )) return; + $.extend(true, inst.options, stateData); // update layout options + // if layout has already been initialized, then UPDATE layout state + if (inst.state.initialized) { + var pane, vis, o, s, h, c + , noAnimate = (animate===false) + ; + $.each($.layout.config.borderPanes, function (idx, pane) { + state = inst.state[pane]; + o = stateData[ pane ]; + if (typeof o != 'object') return; // no key, continue + s = o.size; + c = o.initClosed; + h = o.initHidden; + vis = state.isVisible; + // resize BEFORE opening + if (!vis) + inst.sizePane(pane, s, false, false); + if (h === true) inst.hide(pane, noAnimate); + else if (c === false) inst.open (pane, false, noAnimate); + else if (c === true) inst.close(pane, false, noAnimate); + else if (h === false) inst.show (pane, false, noAnimate); + // resize AFTER any other actions + if (vis) + inst.sizePane(pane, s, false, noAnimate); // animate resize if option passed + }); + }; + } + + /** + * Get the *current layout state* and return it as a hash + * + * @param {Object=} inst + * @param {(string|Array)=} keys + */ +, readState: function (inst, keys) { + var + data = {} + , alt = { isClosed: 'initClosed', isHidden: 'initHidden' } + , state = inst.state + , panes = $.layout.config.allPanes + , pair, pane, key, val + ; + if (!keys) keys = inst.options.stateManagement.stateKeys; // if called by user + if ($.isArray(keys)) keys = keys.join(","); + // convert keys to an array and change delimiters from '__' to '.' + keys = keys.replace(/__/g, ".").split(','); + // loop keys and create a data hash + for (var i=0, n=keys.length; i < n; i++) { + pair = keys[i].split("."); + pane = pair[0]; + key = pair[1]; + if ($.inArray(pane, panes) < 0) continue; // bad pane! + val = state[ pane ][ key ]; + if (val == undefined) continue; + if (key=="isClosed" && state[pane]["isSliding"]) + val = true; // if sliding, then *really* isClosed + ( data[pane] || (data[pane]={}) )[ alt[key] ? alt[key] : key ] = val; + } + return data; + } + + /** + * Stringify a JSON hash so can save in a cookie or db-field + */ +, encodeJSON: function (JSON) { + return parse(JSON); + function parse (h) { + var D=[], i=0, k, v, t; // k = key, v = value + for (k in h) { + v = h[k]; + t = typeof v; + if (t == 'string') // STRING - add quotes + v = '"'+ v +'"'; + else if (t == 'object') // SUB-KEY - recurse into it + v = parse(v); + D[i++] = '"'+ k +'":'+ v; + } + return '{'+ D.join(',') +'}'; + }; + } + + /** + * Convert stringified JSON back to a hash object + * @see $.parseJSON(), adding in jQuery 1.4.1 + */ +, decodeJSON: function (str) { + try { return $.parseJSON ? $.parseJSON(str) : window["eval"]("("+ str +")") || {}; } + catch (e) { return {}; } + } + + +, _create: function (inst) { + var _ = $.layout.state; + // ADD State-Management plugin methods to inst + $.extend( inst, { + // readCookie - update options from cookie - returns hash of cookie data + readCookie: function () { return _.readCookie(inst); } + // deleteCookie + , deleteCookie: function () { _.deleteCookie(inst); } + // saveCookie - optionally pass keys-list and cookie-options (hash) + , saveCookie: function (keys, cookieOpts) { return _.saveCookie(inst, keys, cookieOpts); } + // loadCookie - readCookie and use to loadState() - returns hash of cookie data + , loadCookie: function () { return _.loadCookie(inst); } + // loadState - pass a hash of state to use to update options + , loadState: function (stateData, animate) { _.loadState(inst, stateData, animate); } + // readState - returns hash of current layout-state + , readState: function (keys) { return _.readState(inst, keys); } + // add JSON utility methods too... + , encodeJSON: _.encodeJSON + , decodeJSON: _.decodeJSON + }); + + // init state.stateData key, even if plugin is initially disabled + inst.state.stateData = {}; + + // read and load cookie-data per options + var oS = inst.options.stateManagement; + if (oS.enabled) { + if (oS.autoLoad) // update the options from the cookie + inst.loadCookie(); + else // don't modify options - just store cookie data in state.stateData + inst.state.stateData = inst.readCookie(); + } + } + +, _unload: function (inst) { + var oS = inst.options.stateManagement; + if (oS.enabled) { + if (oS.autoSave) // save a state-cookie automatically + inst.saveCookie(); + else // don't save a cookie, but do store state-data in state.stateData key + inst.state.stateData = inst.readState(); + } + } + +}; + +// add state initialization method to Layout's onCreate array of functions +$.layout.onCreate.push( $.layout.state._create ); +$.layout.onUnload.push( $.layout.state._unload ); + + + + +/** + * jquery.layout.buttons 1.0 + * $Date$ + * + * Copyright (c) 2010 + * Kevin Dalman (http://allpro.net) + * + * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html) + * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses. + * + * @dependancies: UI Layout 1.3.0.rc30.1 or higher + * + * @support: http://groups.google.com/group/jquery-ui-layout + * + * Docs: [ to come ] + * Tips: [ to come ] + */ + +// tell Layout that the state plugin is available +$.layout.plugins.buttons = true; + +// Add buttons options to layout.defaults +$.layout.defaults.autoBindCustomButtons = false; +// Specify autoBindCustomButtons as a layout-option, NOT a pane-option +$.layout.optionsMap.layout.push("autoBindCustomButtons"); + +var lang = $.layout.language; + +/* + * Button methods + */ +$.layout.buttons = { + + /** + * Searches for .ui-layout-button-xxx elements and auto-binds them as layout-buttons + * + * @see _create() + * + * @param {Object} inst Layout Instance object + */ + init: function (inst) { + var pre = "ui-layout-button-" + , layout = inst.options.name || "" + , name; + $.each("toggle,open,close,pin,toggle-slide,open-slide".split(","), function (i, action) { + $.each($.layout.config.borderPanes, function (ii, pane) { + $("."+pre+action+"-"+pane).each(function(){ + // if button was previously 'bound', data.layoutName was set, but is blank if layout has no 'name' + name = $(this).data("layoutName") || $(this).attr("layoutName"); + if (name == undefined || name === layout) + inst.bindButton(this, action, pane); + }); + }); + }); + } + + /** + * Helper function to validate params received by addButton utilities + * + * Two classes are added to the element, based on the buttonClass... + * The type of button is appended to create the 2nd className: + * - ui-layout-button-pin // action btnClass + * - ui-layout-button-pin-west // action btnClass + pane + * - ui-layout-button-toggle + * - ui-layout-button-open + * - ui-layout-button-close + * + * @param {Object} inst Layout Instance object + * @param {(string|!Object)} selector jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button" + * @param {string} pane Name of the pane the button is for: 'north', 'south', etc. + * + * @return {Array.} If both params valid, the element matching 'selector' in a jQuery wrapper - otherwise returns null + */ +, get: function (inst, selector, pane, action) { + var $E = $(selector) + , o = inst.options + , err = o.showErrorMessages + ; + if (!$E.length) { // element not found + if (err) $.layout.msg(lang.errButton + lang.selector +": "+ selector, true); + } + else if ($.inArray(pane, $.layout.config.borderPanes) < 0) { // invalid 'pane' sepecified + if (err) $.layout.msg(lang.errButton + lang.pane +": "+ pane, true); + $E = $(""); // NO BUTTON + } + else { // VALID + var btn = o[pane].buttonClass +"-"+ action; + $E .addClass( btn +" "+ btn +"-"+ pane ) + .data("layoutName", o.name); // add layout identifier - even if blank! + } + return $E; + } + + + /** + * NEW syntax for binding layout-buttons - will eventually replace addToggle, addOpen, etc. + * + * @param {Object} inst Layout Instance object + * @param {(string|!Object)} selector jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button" + * @param {string} action + * @param {string} pane + */ +, bind: function (inst, selector, action, pane) { + var _ = $.layout.buttons; + switch (action.toLowerCase()) { + case "toggle": _.addToggle (inst, selector, pane); break; + case "open": _.addOpen (inst, selector, pane); break; + case "close": _.addClose (inst, selector, pane); break; + case "pin": _.addPin (inst, selector, pane); break; + case "toggle-slide": _.addToggle (inst, selector, pane, true); break; + case "open-slide": _.addOpen (inst, selector, pane, true); break; + } + return inst; + } + + /** + * Add a custom Toggler button for a pane + * + * @param {Object} inst Layout Instance object + * @param {(string|!Object)} selector jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button" + * @param {string} pane Name of the pane the button is for: 'north', 'south', etc. + * @param {boolean=} slide true = slide-open, false = pin-open + */ +, addToggle: function (inst, selector, pane, slide) { + $.layout.buttons.get(inst, selector, pane, "toggle") + .click(function(evt){ + inst.toggle(pane, !!slide); + evt.stopPropagation(); + }); + return inst; + } + + /** + * Add a custom Open button for a pane + * + * @param {Object} inst Layout Instance object + * @param {(string|!Object)} selector jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button" + * @param {string} pane Name of the pane the button is for: 'north', 'south', etc. + * @param {boolean=} slide true = slide-open, false = pin-open + */ +, addOpen: function (inst, selector, pane, slide) { + $.layout.buttons.get(inst, selector, pane, "open") + .attr("title", lang.Open) + .click(function (evt) { + inst.open(pane, !!slide); + evt.stopPropagation(); + }); + return inst; + } + + /** + * Add a custom Close button for a pane + * + * @param {Object} inst Layout Instance object + * @param {(string|!Object)} selector jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button" + * @param {string} pane Name of the pane the button is for: 'north', 'south', etc. + */ +, addClose: function (inst, selector, pane) { + $.layout.buttons.get(inst, selector, pane, "close") + .attr("title", lang.Close) + .click(function (evt) { + inst.close(pane); + evt.stopPropagation(); + }); + return inst; + } + + /** + * Add a custom Pin button for a pane + * + * Four classes are added to the element, based on the paneClass for the associated pane... + * Assuming the default paneClass and the pin is 'up', these classes are added for a west-pane pin: + * - ui-layout-pane-pin + * - ui-layout-pane-west-pin + * - ui-layout-pane-pin-up + * - ui-layout-pane-west-pin-up + * + * @param {Object} inst Layout Instance object + * @param {(string|!Object)} selector jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button" + * @param {string} pane Name of the pane the pin is for: 'north', 'south', etc. + */ +, addPin: function (inst, selector, pane) { + var _ = $.layout.buttons + , $E = _.get(inst, selector, pane, "pin"); + if ($E.length) { + var s = inst.state[pane]; + $E.click(function (evt) { + _.setPinState(inst, $(this), pane, (s.isSliding || s.isClosed)); + if (s.isSliding || s.isClosed) inst.open( pane ); // change from sliding to open + else inst.close( pane ); // slide-closed + evt.stopPropagation(); + }); + // add up/down pin attributes and classes + _.setPinState(inst, $E, pane, (!s.isClosed && !s.isSliding)); + // add this pin to the pane data so we can 'sync it' automatically + // PANE.pins key is an array so we can store multiple pins for each pane + s.pins.push( selector ); // just save the selector string + } + return inst; + } + + /** + * Change the class of the pin button to make it look 'up' or 'down' + * + * @see addPin(), syncPins() + * + * @param {Object} inst Layout Instance object + * @param {Array.} $Pin The pin-span element in a jQuery wrapper + * @param {string} pane These are the params returned to callbacks by layout() + * @param {boolean} doPin true = set the pin 'down', false = set it 'up' + */ +, setPinState: function (inst, $Pin, pane, doPin) { + var updown = $Pin.attr("pin"); + if (updown && doPin === (updown=="down")) return; // already in correct state + var + pin = inst.options[pane].buttonClass +"-pin" + , side = pin +"-"+ pane + , UP = pin +"-up "+ side +"-up" + , DN = pin +"-down "+side +"-down" + ; + $Pin + .attr("pin", doPin ? "down" : "up") // logic + .attr("title", doPin ? lang.Unpin : lang.Pin) + .removeClass( doPin ? UP : DN ) + .addClass( doPin ? DN : UP ) + ; + } + + /** + * INTERNAL function to sync 'pin buttons' when pane is opened or closed + * Unpinned means the pane is 'sliding' - ie, over-top of the adjacent panes + * + * @see open(), close() + * + * @param {Object} inst Layout Instance object + * @param {string} pane These are the params returned to callbacks by layout() + * @param {boolean} doPin True means set the pin 'down', False means 'up' + */ +, syncPinBtns: function (inst, pane, doPin) { + // REAL METHOD IS _INSIDE_ LAYOUT - THIS IS HERE JUST FOR REFERENCE + $.each(state[pane].pins, function (i, selector) { + $.layout.buttons.setPinState(inst, $(selector), pane, doPin); + }); + } + + +, _load: function (inst) { + var _ = $.layout.buttons; + // ADD Button methods to Layout Instance + // Note: sel = jQuery Selector string + $.extend( inst, { + bindButton: function (sel, action, pane) { return _.bind(inst, sel, action, pane); } + // DEPRECATED METHODS + , addToggleBtn: function (sel, pane, slide) { return _.addToggle(inst, sel, pane, slide); } + , addOpenBtn: function (sel, pane, slide) { return _.addOpen(inst, sel, pane, slide); } + , addCloseBtn: function (sel, pane) { return _.addClose(inst, sel, pane); } + , addPinBtn: function (sel, pane) { return _.addPin(inst, sel, pane); } + }); + + // init state array to hold pin-buttons + for (var i=0; i<4; i++) { + var pane = $.layout.config.borderPanes[i]; + inst.state[pane].pins = []; + } + + // auto-init buttons onLoad if option is enabled + if ( inst.options.autoBindCustomButtons ) + _.init(inst); + } + +, _unload: function (inst) { + // TODO: unbind all buttons??? + } + +}; + +// add initialization method to Layout's onLoad array of functions +$.layout.onLoad.push( $.layout.buttons._load ); +//$.layout.onUnload.push( $.layout.buttons._unload ); + + + +/** + * jquery.layout.browserZoom 1.0 + * $Date$ + * + * Copyright (c) 2012 + * Kevin Dalman (http://allpro.net) + * + * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html) + * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses. + * + * @dependancies: UI Layout 1.3.0.rc30.1 or higher + * + * @support: http://groups.google.com/group/jquery-ui-layout + * + * @todo: Extend logic to handle other problematic zooming in browsers + * @todo: Add hotkey/mousewheel bindings to _instantly_ respond to these zoom event + */ + +// tell Layout that the plugin is available +$.layout.plugins.browserZoom = true; + +$.layout.defaults.browserZoomCheckInterval = 1000; +$.layout.optionsMap.layout.push("browserZoomCheckInterval"); + +/* + * browserZoom methods + */ +$.layout.browserZoom = { + + _init: function (inst) { + // abort if browser does not need this check + if ($.layout.browserZoom.ratio() !== false) + $.layout.browserZoom._setTimer(inst); + } + +, _setTimer: function (inst) { + // abort if layout destroyed or browser does not need this check + if (inst.destroyed) return; + var o = inst.options + , s = inst.state + // don't need check if inst has parentLayout, but check occassionally in case parent destroyed! + // MINIMUM 100ms interval, for performance + , ms = inst.hasParentLayout ? 5000 : Math.max( o.browserZoomCheckInterval, 100 ) + ; + // set the timer + setTimeout(function(){ + if (inst.destroyed || !o.resizeWithWindow) return; + var d = $.layout.browserZoom.ratio(); + if (d !== s.browserZoom) { + s.browserZoom = d; + inst.resizeAll(); + } + // set a NEW timeout + $.layout.browserZoom._setTimer(inst); + } + , ms ); + } + +, ratio: function () { + var w = window + , s = screen + , d = document + , dE = d.documentElement || d.body + , b = $.layout.browser + , v = b.version + , r, sW, cW + ; + // we can ignore all browsers that fire window.resize event onZoom + if ((b.msie && v > 8) + || !b.msie + ) return false; // don't need to track zoom + + if (s.deviceXDPI) + return calc(s.deviceXDPI, s.systemXDPI); + // everything below is just for future reference! + if (b.webkit && (r = d.body.getBoundingClientRect)) + return calc((r.left - r.right), d.body.offsetWidth); + if (b.webkit && (sW = w.outerWidth)) + return calc(sW, w.innerWidth); + if ((sW = s.width) && (cW = dE.clientWidth)) + return calc(sW, cW); + return false; // no match, so cannot - or don't need to - track zoom + + function calc (x,y) { return (parseInt(x,10) / parseInt(y,10) * 100).toFixed(); } + } + +}; +// add initialization method to Layout's onLoad array of functions +$.layout.onReady.push( $.layout.browserZoom._init ); + + + +})( jQuery ); \ No newline at end of file diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-anim_basic_16x16.gif b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-anim_basic_16x16.gif new file mode 100644 index 0000000000000000000000000000000000000000..085ccaecaf5fa5c34bc14cd2c2ed5cbbd8e25dcb GIT binary patch literal 1553 zcma)+TTl~c6vwlh>nb99Af5rT)t{mCEg5urg=A(g z{C|6SPb~9Xage|wB`SrZk2FOMYM!buln2sX?5Y+T78iB(Zu9cS7|LZyZ++}u$^oi1 z_j@S}bW9OzU2R+RMy&~OT>X-oZ98$jq#ogNfJ!BM-42wHGZk*6s2KD}U*IA%epmxb zm}|6BK9YoIF;*xSL!+z@<64lB7->LTW2Vi4ostCA(z&2XniwNIv}fFo-`MbG;)u4G z^p@F!)|9HhZprHd_vXjDoxs6WkK-6P0@lfxnGT>*p(QHoUV=u1FAqb@b%*W=a3{`LsH5k^AvQNL>6fPpy#oU(&MuH(*aEX4b35*} zn4n7)`I2U%=+Z=?BVZQ?vjQFW4gD@~XSOO6b{qu81`4&LFuU2(ilxW+1|ZkNMnWe79C$gs zWT?Ele|HR{JGPe)5BTW>0Ey?-Ls6S#GoV0tbt6ku7B&*0 z;i9QM$W1Rj*rRIdceL)rAOSl+sDe3LkB87<%){;ZdHp6|SNlopDXRx< zxBDF9-lTo&v`8$humFygUij@qgT=Qzhj8{ym2-{Xciwqq_Xwk%=O3B-MNAL_6e`3U zyxwmXex4`g0^1RYw~Dth3av3Dl^AAlpO3mG!nLr#&ZZ7c_wUboI+deC+&%TFjK2Lm z!Y&f1h|T_On%RCV&=4bx`!>(YezqGVhl&QpED?N6GV)HmzJ9&rh$x*i?*@o9#6QI< z5ZI_MRX;0+pY8$`j)eF#TlUyG(eE%E7S!rj;mj^M5vhUicPm zVWQ2z+imFyg}SRABmOBY_@osR!>7Ov!ioK`NB6_Rv}7Ud?35ed5Sb@?yND?kv~RCa wqs^a3Sh>&&L4)!LKI?D2&k@))k(LESaga|C278ChSzn3NWVkcuNoY&{0f?~U_5c6? literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_flat_0_aaaaaa_40x100.png b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_flat_55_fbec88_40x100.png b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_flat_55_fbec88_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..47acaadd737478ddb090f47f618810712163317b GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*Fsaj7L$B>N1x91EQ8x$BA993)+ za~~)OO5|O5sDCi_{N8&XlRv*c;OQ6|AR59NN?mFzWBXJVGojypu|S6~c)I$ztaD0e F0syyrGF|`x literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_glass_75_d0e5f5_1x400.png b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_glass_75_d0e5f5_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..9d149b1c61fdee2de5cb342741c243abb9058bb3 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAGVZ#9R3S1u{Kd978O6pI&z4VlotPxp?2+ z_9ElQf7546?+BK3Q+%u|q&R!~TD`8c>Nm?7lq=+T^Fw3At=o;a{QQ?&v0rW43t78u zKLhT~Z`;~2oo9{ezlW>%eD?g@v!}03FhOcY)5-`I-U~CHGCzC3{y9?4*Y0Z~JJ3=F MPgg&ebxsLQ09`{nxc~qF literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_glass_85_dfeffc_1x400.png b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_glass_85_dfeffc_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..014951529c315d6042e72febc310a4d2db5b4a82 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq?|lm978O6-<~(*YA_IRxoBVf zfAX@vsV!R#l$@#*eLnw)_Sv|_?i7P!ORnX)SxaXh+BPpZ!Fw~yjr&#G|Jw^YMHDhV X&EsZx`7bsSXc~j3tDnm{r-UW|&(SK+ literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_glass_95_fef1ec_1x400.png b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..4443fdc1a156babad4336f004eaf5ca5dfa0f9ab GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hIh978O6-<~(*YA|4MzBvER z|7}eQtdCVXoUc2b{PaWeaIKu7gJx>{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png new file mode 100644 index 0000000000000000000000000000000000000000..81ecc362d50ef5abbc0420aacd5345822f1f6098 GIT binary patch literal 3457 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 literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_217bc0_256x240.png b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_217bc0_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..6f4bd87c041453ef037c4a9a1a698f0105d02eba GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_2e83ff_256x240.png b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..09d1cdc856c292c4ab6dd818c7543ac0828bd616 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_469bdd_256x240.png b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_469bdd_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..bd2cf079add1ca236adeb509698adabbffb08acb GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_f9bd01_256x240.png b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/theme-redmond/images/ui-icons_f9bd01_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..c7c53cb11904843e176e4ce1f4e7247cd90b3590 GIT binary patch literal 5355 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 t>_S@PWkKlK01oMw@pjEVpN literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/folder-closed.gif b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/folder-closed.gif new file mode 100644 index 0000000000000000000000000000000000000000..be6b59c2bafc37724de6a8904caf8ddb52185f07 GIT binary patch literal 631 zcmV--0*L)bNk%w1VGsZi0OoZ7Zc+gM@owbb(D(J~{kRkV=)C^@`FC9q$-khblVJYv z)5ozv$hAcOfX1|Jz_gHwZxsLR$M*H` z)5VgcjVaB&g#X~Bn}|^6)K>kvApXNk{?U8w>frwL-;#Ym&AMUr=V$)PW&YTa>#Gp{ z$5^hOaMH=J$FMm5$62+73I57t#-KOer4h}bD~WS3yQMU?q;vkxak`{N&AEBc#G?Jc zKK|H{jB+E}qY%KYW|e?Jt%4WhuRrYIzx}uttbPdi>1gcRT)?bi*~ygsy)VYKbl=sl z!LDb`w?4L^YVzd5|KO(4ze~WaWw4)Z<=wvhxEIZ>RsZvV+R0MBjTPX{P^5)3t(IEZ zo(`LK71O>%%$yd@ws6O^WdH2Q^sy2D_NBk8J;AJDcUuPR<<6~{Vg0!m{?dHMvTC`j zfZ5BO|NGMa|Nj6000000000000000000000000000000000000A^8LW004CWEC2ui z01yBW06+)SfOUcbFM}==AarS4f^`T0To+{@4nGeh6)G`B2p9kiNn<+@0|r=5Yepst zIgKY#WJd%9EJPL?t^m4h5ez8-Aqy8z25mic2N?k#R&i4b8U+nh4l7`S2^}ajGc6+$ z6C!V6UyXu5K{9S7=8Z222f8;D0KLCn3s7|l^;H1@N?@2FHGqSVIadS#=nw*efr3kz ztU4o2N*xdYmhp(zfYOQwaCBG@bU+OXEtfKR^UfI%4+*Z?OY3oS7i+9AMEg8&*N RE^xJLBxeY_p@ISd06U6)DM0`L literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/folder.gif b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/folder.gif new file mode 100644 index 0000000000000000000000000000000000000000..be6b59c2bafc37724de6a8904caf8ddb52185f07 GIT binary patch literal 631 zcmV--0*L)bNk%w1VGsZi0OoZ7Zc+gM@owbb(D(J~{kRkV=)C^@`FC9q$-khblVJYv z)5ozv$hAcOfX1|Jz_gHwZxsLR$M*H` z)5VgcjVaB&g#X~Bn}|^6)K>kvApXNk{?U8w>frwL-;#Ym&AMUr=V$)PW&YTa>#Gp{ z$5^hOaMH=J$FMm5$62+73I57t#-KOer4h}bD~WS3yQMU?q;vkxak`{N&AEBc#G?Jc zKK|H{jB+E}qY%KYW|e?Jt%4WhuRrYIzx}uttbPdi>1gcRT)?bi*~ygsy)VYKbl=sl z!LDb`w?4L^YVzd5|KO(4ze~WaWw4)Z<=wvhxEIZ>RsZvV+R0MBjTPX{P^5)3t(IEZ zo(`LK71O>%%$yd@ws6O^WdH2Q^sy2D_NBk8J;AJDcUuPR<<6~{Vg0!m{?dHMvTC`j zfZ5BO|NGMa|Nj6000000000000000000000000000000000000A^8LW004CWEC2ui z01yBW06+)SfOUcbFM}==AarS4f^`T0To+{@4nGeh6)G`B2p9kiNn<+@0|r=5Yepst zIgKY#WJd%9EJPL?t^m4h5ez8-Aqy8z25mic2N?k#R&i4b8U+nh4l7`S2^}ajGc6+$ z6C!V6UyXu5K{9S7=8Z222f8;D0KLCn3s7|l^;H1@N?@2FHGqSVIadS#=nw*efr3kz ztU4o2N*xdYmhp(zfYOQwaCBG@bU+OXEtfKR^UfI%4+*Z?OY3oS7i+9AMEg8&*N RE^xJLBxeY_p@ISd06U6)DM0`L literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-black-line.gif b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-black-line.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5496877a07487f2f7437a9f87e07c590b51160a GIT binary patch literal 1877 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 literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-gray-line.gif b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-gray-line.gif new file mode 100644 index 0000000000000000000000000000000000000000..37600447dc002bbc0dd16e1391b711360aae2e34 GIT binary patch literal 1877 zcmeH``8OK|0LL@bF~qSc#n50?JXNI+k>{#)#go3O{g`&sTA06+?`JRv{%1VB*=kSggPTmbZ?E2@Hm10RaqGJr~M_swEK9(fuU z9bXMur@nY#Xn3Qp;v6X2AT> zA>EM+>y@m1^a49s_E1X&+bZH^!_a=e{N6Su)s&U>sDnd!~=b?JFEB#FT8 zioZMFaK52~t&52oqdWW~2MJ1ue%%?en#qCfU7u!nC|sSJi5E`}X3h8)ly{+5*|mp+ zYqNE`8MkZN-)k};oze-j%*tB&sNuZif|=0wM%!=l0sXF(V)Zg+3_ zjbW;EBEX2ytHG=$Dx2Ha{HE%5V3a1hHnd2R32m%R*9#gFWf^4tEW&~!6yIiV)*e*l zireg~b4-8KL1b9Tn<4TQc-aUN7>=bBxE!0Aep)ES$dA>bZ zlac_>GSf$}Amq|xpG2f_X<$)PU0E=BExZ&}FuYP8&bwD%fgJCOsK5%!A}jIpO{>+( zGV75wBp|A>JOyOlNY1dq-7SE-P1iq3bVQx6%Yk<{*5}84F?-+_`Yq}S#U}_=SCzX? zX`+&GsCqhDsvFh7AWWM#ck=(Rps}W(-f3)-hf$w$i>58wymeug)RAsnbE^=j9L-?f zpi-Z);Tuuyqj4L}9YcZxTIWO&p4K%*X3?0-?f4ef8jtm%XgkyEBd6Ds8uOK?%`{)>0D(Cr`A4IcZoG`&U18YKqjoYtzQo|Dt=**7zk597IbK9sJXFyhNi zwtW@gRcSW?gGKMW@kxrlG#OY-do~qJ*-V&3Js8`Y3GYwom_@$iB+g=ml}U5>1u1QR zAzAiA(jrL>&74Uwwqm}`xJ1AT;O_GsONn5#!*ULyhq;oEIkp%2g#mF(6lf@Jxhn4i zV~t87;8y4{2KZG5ao+KL=SUTJlQq*4|E@_PjJ3`!o(GG)^}?JsMpy*)mQYPCf1;Sk`8-A8at@Xm#Gb>oe(v%3b{156)aykj?nu&|IbZfh z!lZx$?iVd}BHwuNSkmco3iwy5Drr$xV-lid6PqT(u95$N>8c#Jm2RMN_SB1WJe9Oq z(x$uU@TQLQX@QVr>U~Sa;vEmbZ_QL7odp^*-BsqVXSqmf)oqYES3tl*66F0YO=#d1 rlgk$~puxAlhuJ^ZHqgioD1o1DVtQEUit~KllU0$5nh)jV0N{TCC3Zqn literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-gray.gif b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-gray.gif new file mode 100644 index 0000000000000000000000000000000000000000..cfb8a2f0961b880d9ecc9e59f831d0c0bf9d06db GIT binary patch literal 1230 zcmZ?wbhEHbOkikb_|5F}1vNN-#bFE}n2rob1X65+pkEe*DZwLSXy)sc-G6LrLE|#j%ny@ltx#{|>*k3`b zudj+f+$8$@s#fHh^zF++cYjOsT#=i)PgZ*SBbQFk<=6g7TzYe_x%fYqoR5WW_>5Nf zsIRkcJbHA@c(c>D3XzqU)=k#8J9nngIK5|{y|vw$2$RE?mT4~XtDRLEe|<_~c?_?$ zLGJZ!!S{W4%zp58Z=>w%X})`Qe0&`0sXRUALwVLJuj#KvHA1S2+ow&BYJYdfr2O^1 zna!)!@5=7^`T51=)#j2iwbhrWRX*39_q(R{^Y??#w#k`8!n#b?Ah=gT4^b_6Je!p-pqnUi6)T{Kw4)JLb3tD)cb}Z;R&ALM=NKo^J zQum3S7LQAK7iB!^v-vhdvhxz-&N&k%mqtvOXdV2 literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-red-line.gif b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-red-line.gif new file mode 100644 index 0000000000000000000000000000000000000000..df9e749a8f1f58862588efc64988003efad01d51 GIT binary patch literal 1877 zcmeH``BxGK0LPh{$5cGF%CuRcF0W^1+Eb91Y0har@ns%QJPI-bCps}CP-u#GY96he zH{=x}8cR_?6wMSBHp}~@d8B5Ec_ztT`#0A2hwu02&*#0br`JzT&Np-c8>+j2FWJW9 z|J$$i)xiJGfXTkfHvoVFVDp9i%O?Qp3V=f6d5==7Sk4KMl>Ucik`YxtvJ<)$%#TPKR% zdeBegW3Nr-TZ$_DvX!7#=EQu`)|{{_NO4?Hnuz--`I}N3UjF&+?uwLk+=>GJd{B_Tc2OKbjN9H> z96NPSF%oo|+^NT@plDh-RsN>!ws$&N>eV+-RSK`GN-+xQlcpP|{VXMbZmGY?Sg+bE z&yqDeRb-m~Xn;($Rkc9os0lNWR0x7V&viYtFw425?`)O{#Xnxi^Z-rV%z`xuPf1K3U`ignx^9LiY{9RF`M1 z((4&CBBq9gRTxIqvdNQH4XvU-teM=&r#I{BRpE@Mf`UowW*aYDTj; zR~d}wJj7bmv%$EvhL%3@95+YnP@jZFjkyaK?LZqem&Cp}E@#J}7%>obDszfKXbSed{!N zqe%A5h1G9<<|OWgt(pyPNUi%mt_OllWQ$!DHV#9VzJogSLla83`aMi%;zcml$vXr7 zf<%YcL08HgN8s@2tufz(==0;jh0Ny@q4f1T-P5MdE9;FzHSA-Pm3Wn^KX5K-#%-h+YndE*c}A#} z97|nymmXX*xOhw~p_=<#*Rp;q1c;i_)TkyvQ;xgVtY5mTyh_&|ZEzU`%%?)%UDt;N sUpBjNE)^Df<9oQ%i{r+6SwTgJWAz*lYeQMK?>m|{T3!EviV6VoFXq=mv;Y7A literal 0 HcmV?d00001 diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-red.gif b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/images/treeview-red.gif new file mode 100644 index 0000000000000000000000000000000000000000..3bbb3a157f1568d59d6db02b55a3b3fe9a1ff7a7 GIT binary patch literal 1230 zcmZ?wbhEHbOkikb_|5q9rFMYXq;dkzBCUd%AXV z7f->2WoKqf=UU0E5MF-1&C2oHA5RfQ-wyu&du5`wWCYCfT`X0jHDP7Qa?|x$vA=>= zUtbk}xJmT)RjtT1>D!lu?*5kMxgs}ppRDxuM=qV7%dh>Fxb)^;bMb#JIUft%@ENV{ zQD0}@c=YI)@n)xQ6(TDyt(&ZGckWD~aeB`@duzKh5hjN(Ez?}&S39dT{`!=}@)%xg zgWT)eg75q8nEl}G-bUHi(|q^r`1m-~Q+ayKhw`jdUejNTYJ^l3w@;fM)&A~|N%`x2 zGn-ed-<93-^Ye?#tIZ{4YO60#t9-6I?{`h@=kEuf$II8+R(@HSYaUSgyf$2+OgK}0 zZsRjUi+L5dHILtK5edt9=qI|b{eIzIMl<7PRm>?O4!tnstX#kf7!b zrS20uEgqNfF3Nb+XY*}_WalNuopUBkE{&Kl(L5+ZuF(6`HI*Fyu5b4nE$kweHiYk+ hA)Dse=Ki!azG~*body { + font-size: 16px; + font-size: 68.75%; +} Reset Base Font Size */ + /* +body { + font-family: Verdana, helvetica, arial, sans-serif; + font-size: 68.75%; + background: #fff; + color: #333; +} */ + +a img { border: none; } \ No newline at end of file diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/jquery.treeview.min.js b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/jquery.treeview.min.js new file mode 100644 index 000000000..f9b490d3e --- /dev/null +++ b/xs/src/avrdude/atmel-docs/EDBG/common/jquery/treeview/jquery.treeview.min.js @@ -0,0 +1,16 @@ +/* + * Treeview 1.4 - jQuery plugin to hide and show branches of a tree + * + * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/ + * http://docs.jquery.com/Plugins/Treeview + * + * Copyright (c) 2007 Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id$ + * kasunbg: changed the cookieid name + * + */;(function($){$.extend($.fn,{swapClass:function(c1,c2){var c1Elements=this.filter('.'+c1);this.filter('.'+c2).removeClass(c2).addClass(c1);c1Elements.removeClass(c1).addClass(c2);return this;},replaceClass:function(c1,c2){return this.filter('.'+c1).removeClass(c1).addClass(c2).end();},hoverClass:function(className){className=className||"hover";return this.hover(function(){$(this).addClass(className);},function(){$(this).removeClass(className);});},heightToggle:function(animated,callback){animated?this.animate({height:"toggle"},animated,callback):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();if(callback)callback.apply(this,arguments);});},heightHide:function(animated,callback){if(animated){this.animate({height:"hide"},animated,callback);}else{this.hide();if(callback)this.each(callback);}},prepareBranches:function(settings){if(!settings.prerendered){this.filter(":last-child:not(ul)").addClass(CLASSES.last);this.filter((settings.collapsed?"":"."+CLASSES.closed)+":not(."+CLASSES.open+")").find(">ul").hide();}return this.filter(":has(>ul)");},applyClasses:function(settings,toggler){this.filter(":has(>ul):not(:has(>a))").find(">span").click(function(event){toggler.apply($(this).next());}).add($("a",this)).hoverClass();if(!settings.prerendered){this.filter(":has(>ul:hidden)").addClass(CLASSES.expandable).replaceClass(CLASSES.last,CLASSES.lastExpandable);this.not(":has(>ul:hidden)").addClass(CLASSES.collapsable).replaceClass(CLASSES.last,CLASSES.lastCollapsable);this.prepend("

      ").find("div."+CLASSES.hitarea).each(function(){var classes="";$.each($(this).parent().attr("class").split(" "),function(){classes+=this+"-hitarea ";});$(this).addClass(classes);});}this.find("div."+CLASSES.hitarea).click(toggler);},treeview:function(settings){if(typeof(window.treeCookieId) === 'undefined' || window.treeCookieId === ""){treeCookieId = "treeview";} settings=$.extend({cookieId: treeCookieId},settings);if(settings.add){return this.trigger("add",[settings.add]);}if(settings.toggle){var callback=settings.toggle;settings.toggle=function(){return callback.apply($(this).parent()[0],arguments);};}function treeController(tree,control){function handler(filter){return function(){toggler.apply($("div."+CLASSES.hitarea,tree).filter(function(){return filter?$(this).parent("."+filter).length:true;}));return false;};}$("a:eq(0)",control).click(handler(CLASSES.collapsable));$("a:eq(1)",control).click(handler(CLASSES.expandable));$("a:eq(2)",control).click(handler());}function toggler(){$(this).parent().find(">.hitarea").swapClass(CLASSES.collapsableHitarea,CLASSES.expandableHitarea).swapClass(CLASSES.lastCollapsableHitarea,CLASSES.lastExpandableHitarea).end().swapClass(CLASSES.collapsable,CLASSES.expandable).swapClass(CLASSES.lastCollapsable,CLASSES.lastExpandable).find(">ul").heightToggle(settings.animated,settings.toggle);if(settings.unique){$(this).parent().siblings().find(">.hitarea").replaceClass(CLASSES.collapsableHitarea,CLASSES.expandableHitarea).replaceClass(CLASSES.lastCollapsableHitarea,CLASSES.lastExpandableHitarea).end().replaceClass(CLASSES.collapsable,CLASSES.expandable).replaceClass(CLASSES.lastCollapsable,CLASSES.lastExpandable).find(">ul").heightHide(settings.animated,settings.toggle);}}function serialize(){function binary(arg){return arg?1:0;}var data=[];branches.each(function(i,e){data[i]=$(e).is(":has(>ul:visible)")?1:0;});$.cookie(settings.cookieId,data.join(""));}function deserialize(){var stored=$.cookie(settings.cookieId);if(stored){var data=stored.split("");branches.each(function(i,e){$(e).find(">ul")[parseInt(data[i])?"show":"hide"]();});}}this.addClass("treeview");var branches=this.find("li").prepareBranches(settings);switch(settings.persist){case"cookie":var toggleCallback=settings.toggle;settings.toggle=function(){serialize();if(toggleCallback){toggleCallback.apply(this,arguments);}};deserialize();break;case"location":var current=this.find("a").filter(function(){return this.href.toLowerCase()==location.href.toLowerCase();});if(current.length){current.addClass("selected").parents("ul, li").add(current.next()).show();}break;}branches.applyClasses(settings,toggler);if(settings.control){treeController(this,settings.control);$(settings.control).show();}return this.bind("add",function(event,branches){$(branches).prev().removeClass(CLASSES.last).removeClass(CLASSES.lastCollapsable).removeClass(CLASSES.lastExpandable).find(">.hitarea").removeClass(CLASSES.lastCollapsableHitarea).removeClass(CLASSES.lastExpandableHitarea);$(branches).find("li").andSelf().prepareBranches(settings).applyClasses(settings,toggler);});}});var CLASSES=$.fn.treeview.classes={open:"open",closed:"closed",expandable:"expandable",expandableHitarea:"expandable-hitarea",lastExpandableHitarea:"lastExpandable-hitarea",collapsable:"collapsable",collapsableHitarea:"collapsable-hitarea",lastCollapsableHitarea:"lastCollapsable-hitarea",lastCollapsable:"lastCollapsable",lastExpandable:"lastExpandable",last:"last",hitarea:"hitarea"};$.fn.Treeview=$.fn.treeview;})(jQuery); \ No newline at end of file diff --git a/xs/src/avrdude/atmel-docs/EDBG/common/main.js b/xs/src/avrdude/atmel-docs/EDBG/common/main.js new file mode 100644 index 000000000..96b6a86c6 --- /dev/null +++ b/xs/src/avrdude/atmel-docs/EDBG/common/main.js @@ -0,0 +1,282 @@ +/** + * Miscellaneous js functions for WebHelp + * Kasun Gajasinghe, http://kasunbg.blogspot.com + * David Cramer, http://www.thingbag.net + * + */ + +//Turn ON and OFF the animations for Show/Hide Sidebar. Extend this to other anime as well if any. +var noAnimations=false; + +$(document).ready(function() { + + /* Local addition */ + $("a").filter(function() { + return this.hostname && this.hostname !== location.hostname; + }).addClass('external'); + + // When you click on a link to an anchor, scroll down + // 105 px to cope with the fact that the banner + // hides the top 95px or so of the page. + // This code deals with the problem when + // you click on a link within a page. + $('a[href*=#]').click(function() { + if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') + && location.hostname == this.hostname) { + var $target = $(this.hash); + $target = $target.length && $target + || $('[name=' + this.hash.slice(1) +']'); + if (!(this.hash == "#searchDiv" || this.hash == "#treeDiv" || this.hash == "") && $target.length) { + var targetOffset = $target.offset().top - 120; + $('html,body') + .animate({scrollTop: targetOffset}, 200); + return false; + } + } + }); + + // $("#showHideHighlight").button(); //add jquery button styling to 'Go' button + //Generate tabs in nav-pane with JQuery + $(function() { + $("#tabs").tabs({ + cookie: { + expires: 2 // store cookie for 2 days. + } + }); + }); + + //Generate the tree + $("#ulTreeDiv").attr("style", ""); + $("#tree").treeview({ + collapsed: true, + animated: "medium", + control: "#sidetreecontrol", + persist: "cookie" + }); + + //after toc fully styled, display it. Until loading, a 'loading' image will be displayed + $("#tocLoading").attr("style", "display:none;"); + // $("#ulTreeDiv").attr("style","display:block;"); + + //.searchButton is the css class applied to 'Go' button + $(function() { + $("button", ".searchButton").button(); + + $("button", ".searchButton").click(function() { + return false; + }); + }); + + //'ui-tabs-1' is the cookie name which is used for the persistence of the tabs.(Content/Search tab) + if ($.cookie('ui-tabs-1') === '1') { //search tab is active + if ($.cookie('textToSearch') != undefined && $.cookie('textToSearch').length > 0) { + document.getElementById('textToSearch').value = $.cookie('textToSearch'); + Verifie('searchForm'); + searchHighlight($.cookie('textToSearch')); + $("#showHideHighlight").css("display", "block"); + } + } + + syncToc(); //Synchronize the toc tree with the content pane, when loading the page. + //$("#doSearch").button(); //add jquery button styling to 'Go' button + + // When you click on a link to an anchor, scroll down + // 120 px to cope with the fact that the banner + // hides the top 95px or so of the page. + // This code deals with the problem when + // you click on a link from another page. + var hash = window.location.hash; + if(hash){ + var targetOffset = $(hash).offset().top - 120; + $('html,body').animate({scrollTop: targetOffset}, 200); + return false; + } +}); + + +/** + * If an user moved to another page by clicking on a toc link, and then clicked on #searchDiv, + * search should be performed if the cookie textToSearch is not empty. + */ +function doSearch() { +//'ui-tabs-1' is the cookie name which is used for the persistence of the tabs.(Content/Search tab) + if ($.cookie('textToSearch') != undefined && $.cookie('textToSearch').length > 0) { + document.getElementById('textToSearch').value = $.cookie('textToSearch'); + Verifie('searchForm'); + } +} + +/** + * Synchronize with the tableOfContents + */ +function syncToc() { + var a = document.getElementById("webhelp-currentid"); + if (a != undefined) { + //Expanding the child sections of the selected node. + var nodeClass = a.getAttribute("class"); + if (nodeClass != null && !nodeClass.match(/collapsable/)) { + a.setAttribute("class", "collapsable"); + //remove display:none; css style from