////////////////////////////////////////////////////////////////////////////////
//
// Code::Blocks new project wizard script
//
// Project: Atmel AVR project
// Author:  Brian Sidebotham
// Modified: H. Metin OZER
//
////////////////////////////////////////////////////////////////////////////////

// Global Vars
Processor <- _T("");     // The chosen processor
AvrHex <- false;         // produce Hex file from ELF output ?
AvrSrec <- false;              // produce Motorola S-Record files?
AvrBin <- false;               // produce Binary image files?
AvrExt <- false;         // produce extra files .fuse .lock .sig etc...
AvrLss <- false;         // produce extended list file from ELF output?
AvrMap <- false;         // produce Symbol Map file from ELF output?
AvrExtMem <- false;      // Locate .data in on-board SRAM, or external SRAM
AvrExtMemAddr <- ""      // The external memory address
AvrSize <- false;        // Run avr-size after the build
AvrF_CPU <- false;       // Define F_CPU?
AvrF_CPUValue <- _T(""); // F_CPU textual value
Programmer <- _T("");    // Avrdude 'programmer-id'
Debugger <- _T("");      // Avarice debugger choice
DebuggerCon <- _T("");   // Avarice debugger connection type

function BeginWizard()
{
    local wiz_type = Wizard.GetWizardType();

    if (wiz_type == wizProject)
    {
        local intro_msg = _("Welcome to the new Atmel AVR project wizard!\n") +
                          _("This wizard will guide you to create a new Atmel AVR project.\n\n") +
                          _("When you're ready to proceed, please click \"Next\"...");

        Wizard.AddInfoPage(_T("AtmelAVRIntro"), intro_msg);
        Wizard.AddProjectPathPage();
        Wizard.AddCompilerPage(_("GNU AVR GCC Compiler"), _T("avr*"), false, true);
        Wizard.AddPage(_T("processorChoice"));
        //Wizard.AddPage(_T("programmerChoice"));
    }
    else
        print(wiz_type);
}

////////////////////////////////////////////////////////////////////////////////
// Processor choice page
////////////////////////////////////////////////////////////////////////////////


function OnEnter_processorChoice(fwd)
{
    if (fwd)
    {
        Wizard.SetComboboxSelection(_T("comboboxProc"), ConfigManager.Read(_T("/avr_project_wizard/processor"), 0));
    }
    return true;
}

function OnLeave_processorChoice(fwd)
{
    if (fwd)
    {
        Processor = Wizard.GetComboboxStringSelection(_T("comboboxProc"));
        AvrHex = Wizard.IsCheckboxChecked(_T("checkboxHex"));
        AvrSrec = Wizard.IsCheckboxChecked(_T("checkboxSrec"));
        AvrBin = Wizard.IsCheckboxChecked(_T("checkboxBin"));
        AvrExt = Wizard.IsCheckboxChecked(_T("checkboxExt"));
        AvrMap = Wizard.IsCheckboxChecked(_T("checkboxMap"));
        AvrLss = Wizard.IsCheckboxChecked(_T("checkboxLss"));
        AvrExtMem = Wizard.IsCheckboxChecked(_T("checkboxExtMem"));
        AvrExtMemAddr = Wizard.GetTextControlValue(_T("textctrlExtMem"));
        AvrSize = Wizard.IsCheckboxChecked(_T("checkboxAvrSize"));
        AvrF_CPU = Wizard.IsCheckboxChecked(_T("checkboxF_CPU"));
        AvrF_CPUValue = Wizard.GetTextControlValue(_T("textctrlF_CPU"));

        ConfigManager.Write(_T("/avr_project_wizard/processor"), Wizard.GetComboboxSelection(_T("comboboxProc")));
    }
    return true;
}


////////////////////////////////////////////////////////////////////////////////
// Processor choice page
////////////////////////////////////////////////////////////////////////////////

function OnLeave_programmerChoice(fwd)
{
    if (fwd)
    {
        Programmer = Wizard.GetComboboxStringSelection(_T("comboboxProg"));
        Debugger = Wizard.GetComboboxStringSelection(_T("comboboxDbgr"));
        DebuggerCon = Wizard.GetComboboxStringSelection(_T("comboboxDbgrCon"));
    }
    return true;
}

// table with information about fuse bytes
function GetFuseBytes()
{
    local part = Processor;
    local parts  = ::wxArrayString();
    local fuses = ::wxArrayString();

    parts.Add(_T("at43usb320"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("at43usb355"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("at76c711"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("at86rf401"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("at90c8534"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("at90can128"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90can32"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90can64"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90pwm1"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90pwm161"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90pwm2"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90pwm216"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90pwm2b"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90pwm3"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90pwm316"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90pwm3b"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90pwm81"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90s1200"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("at90s2313"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("at90s2323"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("at90s2333"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("at90s2343"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("at90s4414"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("at90s4433"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("at90s4434"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("at90s8515"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("at90s8535"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("at90scr100"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90usb1286"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90usb1287"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90usb162"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90usb646"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90usb647"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at90usb82"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("at94k"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("ata6289"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega103"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega128"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega1280"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega1281"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega1284p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega128rfa1"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega16"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega161"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega162"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega163"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega164a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega164p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega165"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega165a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega165p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega168"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega168a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega168p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega169"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega169a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega169p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega169pa"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega16a"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega16hva"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("atmega16hva2"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega16hvb"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega16hvbrevb"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega16m1"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega16u2"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega16u4"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega2560"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega2561"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega32"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega323"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega324a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega324p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega324pa"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega325"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega3250"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega3250a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega3250p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega3250pa"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega325a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega325p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega325pa"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega328"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega328p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega329"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega3290"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega3290a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega3290p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega3290pa"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega329a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega329p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega329pa"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega32c1"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega32hvb"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega32hvbrevb"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega32m1"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega32u2"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega32u4"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega32u6"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega406"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega48"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega48a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega48p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega48pa"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega64"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega640"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega644"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega644a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega644p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega644pa"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega645"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega6450"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega6450a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega6450p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega645a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega645p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega649"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega6490"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega6490a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega6490p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega649a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega649p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega64c1"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega64hve"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega64m1"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega8"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega8515"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega8535"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("atmega88"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega88a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega88p"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega88pa"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("atmega8hva"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("atmega8u2"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny10"),1); fuses.Add(_T("[BYTE0]"),1);
    parts.Add(_T("attiny11"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("attiny12"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("attiny13"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("attiny13a"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("attiny15"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("attiny1634"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("attiny167"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny20"),1); fuses.Add(_T("[BYTE0]"),1);
    parts.Add(_T("attiny22"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("attiny2313"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny2313a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny24"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny24a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny25"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny26"),1); fuses.Add(_T("[LOW:HIGH]"),1);
    parts.Add(_T("attiny261"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny261a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny28"),1); fuses.Add(_T("[LOW]"),1);
    parts.Add(_T("attiny4"),1); fuses.Add(_T("[BYTE0]"),1);
    parts.Add(_T("attiny40"),1); fuses.Add(_T("[BYTE0]"),1);
    parts.Add(_T("attiny4313"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny43u"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny44"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny44a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny45"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny461"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny461a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny48"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny5"),1); fuses.Add(_T("[BYTE0]"),1);
    parts.Add(_T("attiny84"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny84a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny85"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny861"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny861a"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny87"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny88"),1); fuses.Add(_T("[LOW:HIGH:EXTENDED]"),1);
    parts.Add(_T("attiny9"),1); fuses.Add(_T("[BYTE0]"),1);
    parts.Add(_T("atxmega128a1"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega128a1u"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega128a3"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega128b1"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("atxmega128d3"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega16a4"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega16d4"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega16x1"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("atxmega192a3"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega192d3"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega256a3"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega256a3b"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega256a3bu"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("atxmega256d3"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega32a4"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega32d4"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega32x1"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("atxmega64a1"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega64a1u"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("atxmega64a3"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("atxmega64d3"),1); fuses.Add(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]"),1);
    parts.Add(_T("avr1"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avr2"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avr25"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avr3"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avr31"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avr35"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avr4"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avr5"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avr51"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avr6"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avrtiny10"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avrxmega1"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avrxmega2"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avrxmega3"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avrxmega4"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avrxmega5"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avrxmega6"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("avrxmega7"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("m3000"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("m3000f"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("m3000s"),1); fuses.Add(_T("[]"),1);
    parts.Add(_T("m3001b"),1); fuses.Add(_T("[]"),1);

    part = part.Lower();
    for ( local i = 0 ; i < parts.GetCount() ; i+=1)
    {
        if ( part.Matches( parts.Item(i) ) )
            return _T("") + fuses.Item(i);
    }
    return _T("[]");
}

// -----------------------------------------------------------------------------
// each time, return a string of the form "filename.ext;contents"
// you can change the return string based on <file_index>
// return an empty string to denote that no more files are to be generated
function GetGeneratedFile(file_index)
{
    if (file_index == 0)
    {
        local path = Wizard.FindTemplateFile(_T("avr/files/main.c"));
        return _T("main.c") + _T(";") + IO.ReadFileContents(path);
    }
    else if ( file_index == 1)
    {
        if (AvrExt)
        {
            local fuses = GetFuseBytes();

            local path = ::wxString();
            if (fuses.Matches(_T("[LOW]")) )
                path = Wizard.FindTemplateFile(_T("avr/files/FuseLow.c"));
            else if (fuses.Matches(_T("[LOW:HIGH]")) )
                path = Wizard.FindTemplateFile(_T("avr/files/FuseHigh.c"));
            else if (fuses.Matches(_T("[LOW:HIGH:EXTENDED]")) )
                path = Wizard.FindTemplateFile(_T("avr/files/FuseExt.c"));
            else if (fuses.Matches(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]")) )
                path = Wizard.FindTemplateFile(_T("avr/files/FuseFuse0to4.c"));
            else if (fuses.Matches(_T("[BYTE0]")))
                Message(_("This processor has no fuses."), _("Warning"), wxICON_WARNING);
            else if (fuses.Matches(_T("[]")) )
                Message(_("Don't know how to generate fuses section for this processor."), _("Warning"),
                        wxICON_WARNING);

            if (!path.IsEmpty())
                return _T("fuse.c") + _T(";") + IO.ReadFileContents(path);
        }
    }

    return _T(""); // no more generated files
}

function GetFilesDir()
{
    local result = _T("");
    return result;
}

// setup the already created project
function SetupProject(project)
{
    // Linker options
    local lo_map = ::wxString();
    local lo_extmem = ::wxString();

    // Post Build steps
    local pb_avrsize = ::wxString();

    local pb_eephex = ::wxString();
    local pb_fusehex = ::wxString();
    local pb_lockhex = ::wxString();
    local pb_sighex = ::wxString();
    local pb_hex = ::wxString();
    local pb_lfshex = ::wxString();
    local pb_hfshex = ::wxString();
    local pb_efshex = ::wxString();

    local pb_eepbin = ::wxString();
    local pb_fusebin = ::wxString();
    local pb_lockbin = ::wxString();
    local pb_sigbin = ::wxString();
    local pb_bin = ::wxString();

    local pb_eepsrec = ::wxString();
    local pb_fusesrec = ::wxString();
    local pb_locksrec = ::wxString();
    local pb_sigsrec = ::wxString();
    local pb_srec = ::wxString();

    local pb_lss = ::wxString();


    local AvrExtFuse = AvrExt;
    local fuses = GetFuseBytes();
    if (fuses.Matches(_T("[BYTE0]")))
        AvrExtFuse = false;
    if (fuses.Matches(_T("[]")) )
        AvrExtFuse = false;


    // Post build commands
    pb_eephex = _T("avr-objcopy --no-change-warnings -j .eeprom --change-section-lma .eeprom=0 -O ihex $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).eep");
    pb_fusehex = _T("avr-objcopy --no-change-warnings -j .fuse --change-section-lma .fuse=0 -O ihex $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).fuse");
    pb_lockhex = _T("avr-objcopy --no-change-warnings -j .lock --change-section-lma .lock=0 -O ihex $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).lock");
    pb_sighex = _T("avr-objcopy --no-change-warnings -j .signature --change-section-lma .signature=0 -O ihex $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).sig");
    pb_hex = _T("avr-objcopy -R .eeprom -R .fuse -R .lock -R .signature -O ihex $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).hex");
    pb_lfshex = _T("srec_cat $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).fuse -Intel -crop 0x00 0x01 -offset  0x00 -O $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).lfs -Intel ");
    pb_hfshex = _T("srec_cat $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).fuse -Intel -crop 0x01 0x02 -offset -0x01 -O $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).hfs -Intel ");
    pb_efshex = _T("srec_cat $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).fuse -Intel -crop 0x02 0x03 -offset -0x02 -O $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).efs -Intel ");

    pb_eepbin = _T("avr-objcopy --no-change-warnings -j .eeprom --change-section-lma .eeprom=0 -O binary $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).eep");
    pb_fusebin = _T("avr-objcopy --no-change-warnings -j .fuse --change-section-lma .fuse=0 -O binary $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).fuse");
    pb_lockbin = _T("avr-objcopy --no-change-warnings -j .lock --change-section-lma .lock=0 -O binary $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).lock");
    pb_sigbin = _T("avr-objcopy --no-change-warnings -j .signature --change-section-lma .signature=0 -O binary $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).sig");
    pb_bin = _T("avr-objcopy -R .eeprom -R .fuse -R .lock -R .signature -O binary $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).bin");

    pb_eepsrec = _T("avr-objcopy --no-change-warnings -j .eeprom --change-section-lma .eeprom=0 -O srec $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).eep");
    pb_fusesrec = _T("avr-objcopy --no-change-warnings -j .fuse --change-section-lma .fuse=0 -O srec $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).fuse");
    pb_locksrec = _T("avr-objcopy --no-change-warnings -j .lock --change-section-lma .lock=0 -O srec $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).lock");
    pb_sigsrec = _T("avr-objcopy --no-change-warnings -j .signature --change-section-lma .signature=0 -O srec $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).sig");
    pb_srec = _T("avr-objcopy -R .eeprom -R .fuse -R .lock -R .signature -O srec $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).srec");

    if ( PLATFORM == PLATFORM_MSW )
        pb_lss = _T("cmd /c \"avr-objdump -h -S $(TARGET_OUTPUT_FILE) > $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).lss\"");
    else
        pb_lss = _T("avr-objdump -h -S $(TARGET_OUTPUT_FILE) > $(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).lss");

    // avr-size is compiled with patches under winavr to produce a fancy output
    // which displays the percentage of memory used by the application for the
    // target mcu. However, this option is not available under standard binutils
    // avr-size.
    if (PLATFORM_MSW == PLATFORM)
        pb_avrsize = _T("avr-size --mcu=") + Processor + _T(" --format=avr $(TARGET_OUTPUT_FILE)");
    else
        pb_avrsize = _T("avr-size $(TARGET_OUTPUT_FILE)");

    // Setup the linker options
    lo_map = _T("-Wl,-Map=$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).map,--cref");

    // Get external memory start address
    lo_extmem = _T("-Wl,--section-start=.data=") + AvrExtMemAddr;

    // Project compiler options
    WarningsOn(project, Wizard.GetCompilerID());
    project.AddCompilerOption(_T("-mmcu=") + Processor);

    if (AvrF_CPU)
        project.AddCompilerOption(_T("-DF_CPU=") + AvrF_CPUValue);

    // Project linker options
    project.AddLinkerOption(_T("-mmcu=") + Processor);

    if (AvrMap)
        project.AddLinkerOption(lo_map);

    if (AvrExtMem)
        project.AddLinkerOption(lo_extmem);

    // Project post-build steps
    if (AvrSize)
        project.AddCommandsAfterBuild(pb_avrsize);

    if (AvrLss)
        project.AddCommandsAfterBuild(pb_lss);

    if (AvrHex)
    {
        project.AddCommandsAfterBuild(pb_hex);
        project.AddCommandsAfterBuild(pb_eephex);

        if (AvrExt)
        {
            project.AddCommandsAfterBuild(pb_lockhex);
            project.AddCommandsAfterBuild(pb_sighex);
            if (AvrExtFuse)
            {
                project.AddCommandsAfterBuild(pb_fusehex);

                if (fuses.Matches(_T("[LOW]")) )
                {
                    project.AddCommandsAfterBuild(pb_lfshex);
                }
                else if (fuses.Matches(_T("[LOW:HIGH]")) )
                {
                    project.AddCommandsAfterBuild(pb_lfshex);
                    project.AddCommandsAfterBuild(pb_hfshex);
                }
                else if (fuses.Matches(_T("[LOW:HIGH:EXTENDED]")) )
                {
                    project.AddCommandsAfterBuild(pb_lfshex);
                    project.AddCommandsAfterBuild(pb_hfshex);
                    project.AddCommandsAfterBuild(pb_efshex);
                }
                //else if (fuses.Matches(_T("[FUSE0:FUSE1:FUSE2:FUSE3:FUSE4]")) )
            }
        }
    }

    if (AvrSrec)
    {
        project.AddCommandsAfterBuild(pb_srec);
        project.AddCommandsAfterBuild(pb_eepsrec);

        if (AvrExt)
        {
            project.AddCommandsAfterBuild(pb_locksrec);
            project.AddCommandsAfterBuild(pb_sigsrec);
            if (AvrExtFuse)
                project.AddCommandsAfterBuild(pb_fusesrec);
        }
    }

    if (AvrBin)
    {
        project.AddCommandsAfterBuild(pb_bin);
        project.AddCommandsAfterBuild(pb_eepbin);

        if (AvrExt)
        {
            project.AddCommandsAfterBuild(pb_lockbin);
            project.AddCommandsAfterBuild(pb_sigbin);
            if (AvrExtFuse)
                project.AddCommandsAfterBuild(pb_fusebin);
        }
    }


    // Debug build target
    local target = project.GetBuildTarget(Wizard.GetDebugName());
    if (!IsNull(target))
    {
        target.SetTargetType(ttNative);
        target.SetTargetFilenameGenerationPolicy(tgfpPlatformDefault, tgfpNone);
        target.SetOutputFilename(Wizard.GetDebugOutputDir() + Wizard.GetProjectName() + _T(".elf"));
        DebugSymbolsOn(target, Wizard.GetCompilerID());
    }

    // Release build target
    target = project.GetBuildTarget(Wizard.GetReleaseName());
    if (!IsNull(target))
        {
            target.SetTargetType(ttNative);
            target.SetTargetFilenameGenerationPolicy(tgfpPlatformDefault, tgfpNone);
            target.SetOutputFilename(Wizard.GetReleaseOutputDir() + Wizard.GetProjectName() + _T(".elf"));
            OptimizationsOn(target, Wizard.GetCompilerID());
        }

    project.SetVar(_T("MCU"), Processor, false);
    //project.SetVar(_T("PROGRAMMER"), Programmer, false);
    //project.SetVar(_T("DEBUGGER"), Debugger, false);
    //project.SetVar(_T("DEBUGGER_CONNECTION"), DebuggerCon, false);

    return true;
}
