/************************************************************************
Segger JLink Programmer GUI API

Alle software in dit bestand is                                     
Copyright 2013-2014 Hogeschool van Arnhem en Nijmegen                              
$Id: JLinkProgrammer.h 1833 2015-03-21 16:09:20Z ewout $
************************************************************************/

// -*- C++ -*- generated by wxGlade 0.6.5 (standalone edition) on Thu Oct 25 13:07:12 2012

#ifndef JLinkPROGRAMMER_H
#define JLinkPROGRAMMER_H

#include <wx/wx.h>
#include <wx/image.h>
#include <wx/listbox.h>
#include <wx/socket.h>
#include <wx/timer.h>
#include <wx/filehistory.h>
#include <wx/dnd.h>

// begin wxGlade: ::dependencies
#include <wx/spinctrl.h>
#include <wx/tglbtn.h>
#include <wx/treectrl.h>
// end wxGlade

// begin wxGlade: ::extracode
// end wxGlade

#include <desktopApp.h>
#include <wx/app.h>
#include <wx/filepicker.h>
#include <wx/filename.h>
#include <wx/stc/stc.h>
#include <wx/dir.h>
#include <wx/socket.h>
#include <wx/process.h>
#include <wx/dynarray.h>
#include <wx/hashmap.h>

#include <JLinkProcess.h>
#include <JLinkARMDLL.h>

WX_DECLARE_HASH_MAP_WITH_DECL( UInt32, wxString, wxIntegerHash, wxIntegerEqual,
                               wxSTM32HashMap, class WXDLLIMPEXP_BASE );

WX_DECLARE_HASH_MAP_WITH_DECL( UInt32, UInt32, wxIntegerHash, wxIntegerEqual,
                               wxSTM32UnIDHashMap, class WXDLLIMPEXP_BASE );

//WX_DECLARE_HASH_MAP_WITH_DECL( wxString, wxString, wxStringHash, wxStringEqual,
//                               wxObjCopyHashMap, class WXDLLIMPEXP_BASE );


class JLinkVensterKlasse: public wxFrame 
{
	
public:
     // begin wxGlade: JLinkVensterKlasse::ids
     // end wxGlade

    JLinkVensterKlasse(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_FRAME_STYLE);
    ~JLinkVensterKlasse();

    bool schrijfFlash(const wxFileName &);
    bool verbonden() const;  /* geef aan of verbinding met target bestaat (voor drag and drop) */
protected:
     // begin wxGlade: JLinkVensterKlasse::attributes
     wxStaticBox* debugSizer_staticbox;
     wxStaticBox* jlinkSWOSizer_staticbox;
     wxStaticBox* sizer_26_staticbox;
     wxStaticBox* jlinkGDBSizer_staticbox;
     wxStaticBox* flashSizer_staticbox;
     wxStaticBox* sizer_8_staticbox;
     wxStaticBox* sizer_14_staticbox;
     wxStaticBox* swoSizer_staticbox;
     wxStaticBox* logSizer_staticbox;
     wxStaticBox* sizer_10_staticbox;
     wxStaticBox* sizer_12_staticbox;
     wxStaticBox* gdbPickerCtrl_staticbox;
     wxStaticBox* sizer_18_staticbox;
     wxStaticBox* sizer_20_staticbox;
     wxMenuBar* menubar;
     wxStatusBar* statusbar;
     wxRadioBox* jlinkConnectionRadioBox;
     wxTextCtrl* USBSerialTextCtrl;
     wxComboBox* targetNameComboBox;
     wxButton* bewaarButton;
     wxButton* vindDeviceButton;
     wxButton* verwijderButton;
     wxRadioBox* speedRadioBox;
     wxSpinCtrl* cpuFreqSpinCtrl;
     wxChoice* freqDimensieChoice;
     wxChoice* interfaceKeuzeChoice;
     wxChoice* endiannessChoice;
     wxFilePickerCtrl* gdbScriptOpenPickerCtrl;
     wxTextCtrl* statusTextCtrl;
     wxScrolledWindow* logPaneel;
     wxTextCtrl* swoTextCtrl;
     wxScrolledWindow* swoPaneel;
     wxFilePickerCtrl* openKnop;
     wxToggleButton* verbindKnop;
     wxButton* schrijfFlashKnop;
     wxTextCtrl* flashLaadTextCtrl;
     wxButton* veegUitKnop;
     wxButton* haltButton;
     wxButton* goButton;
     wxButton* resetButton;
     wxTreeCtrl* statusBoom;
     wxStaticText* poortLabel;
     wxSpinCtrl* gdbipPoortCtrl;
     wxCheckBox* gdbVerifyDownloadCheckBox;
     wxCheckBox* gdbServerSilentCheckBox;
     wxCheckBox* gdbServerSingleRunCheckBox;
     wxToggleButton* debugKnop;
     wxToggleButton* gdbSwoKnop;
     wxToggleButton* dddButton;
     wxStaticText* poortLabel_copy;
     wxSpinCtrl* swoPoortCtrl;
     wxStaticText* swoSpeedLabel;
     wxSpinCtrl* swoSpeedCtrl;
     wxStaticText* swoDimLabel;
     wxToggleButton* swoButton;
     wxCheckListBox* swoCheckListBox;
     wxButton* sluitKnop;
     wxPanel* achtergrondPaneel;
     // end wxGlade

    DECLARE_EVENT_TABLE();

    wxTimer timer;
	
private:
     // begin wxGlade: JLinkVensterKlasse::methods
     void set_properties();
     void do_layout();
     // end wxGlade

	 void stm32DeviceIDInit();

	void verbind();

    UInt32 leesUSBSerialID() const;
    UInt32 leesLaadAdres() const;
    UInt32 leesSWOMaskBits() const;
	
    void haltTarget() const;
    void getSetMaxSpeed();
	
    void showDLLInfo() const;
    void showFirmwareInfo() const;
    void reset(const JLINKARM_RESET_TYPE,
               const unsigned int delay) const;

    bool JLinkExecCmd(const wxString &) const;  /* voer een JLink Exec cmd uit */
 
    void zetKnoppen(const DeviceConfig &);  /* zet alle knoppen met deze config */
    DeviceConfig leesKnoppen() const;       /* lees de knoppen in een config */

    /* boodschap formatting naar log venster */
    void printGoed(const wxString &) const;
    void printWaarschuwing(const wxString &) const;
    void printFout(const wxString &) const;

    void bestandGeschiedenisUpdater();   /* werk de bestandgeschiedenis bij */

	/*! @brief Converteer een bin/elf/hex naar een ander formaat, en sla het op in een tijdelijke bestand 
	 * @param Het brondbestand
	 * @param Het bestemmingbestand.
	 * @note de extensie van de bestandnamen geeft de typeconversie aan.
	 * @return Is de conversie geslaagd uitgevoerd of niet */
	FoutCode converteerBestand(const wxFileName &,
						   const wxFileName &) const;

    wxLog *log;
    wxFileHistory bestandGeschiedenis;
	wxFileName laatstePad;  /* helper om in dialoog het laatste pad te gebruiken */
    wxBitmap hanBitmap;

//    wxString objCopyPad;
//    wxString gdbPad;
    wxString seggerDirPad;
    wxString armDirPad;
    wxString dddPad;

    wxString swoBestandPad;
    wxString favFabrikant;

    UInt16 snelheid,echteSnelheid;  /* snelheid keuze */
    Int32 niceness;    /* GDB server BSD/Sys5 niceness */

    DebugServerProcess *debugServer;
    DebuggerProcess *debugger;
    wxSocketClient *gdbSwoClient;  /* for receiving SWO data sent through GDB */
    SWOViewerProcess *swoViewer;
	wxMenu *tbRecenteBestandenMenu;
	
    wxConfig * const appConfig;    
    DeviceConfigLijst configLijst;
    Teller huidigTarget;
	
    const wxTextAttr goedeStatusTextAttr,waarschuwingStatusTextAttr,fouteStatusTextAttr;
    const wxString seggerStandaardPad,armStandaardPad,dddStandaardPad;

	wxSTM32HashMap stm32Devices;
	wxSTM32UnIDHashMap stm32UniqueIDs;

    /* voor het ontdekken van SWD verbinding */
    static const UInt8 aDir[33];
    static const UInt8 aIn[33];
    static const char *logo[];
    static const UInt32 BestandGeschiedenisMax = 9;

	typedef enum
	{
		elf=0,
		bin,
		hex
	} ObjCopyBestandType;

	//wxArrayString objCopyBestandCommando;

protected:
    virtual void laadAdresHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void openBestandHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void schrijfFlashHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void eraseFlashHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void overHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void eindeHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void verbindHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void startDebugHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void kiesSeggerDirHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void resetTargetHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void targetInterfaceKeuzeHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void targetSpeedKeuzeHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void startSWOHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void saveSWOHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void clearLogWindowsHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void kiesARMDirHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void restartTargetHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void haltTargetHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void speedSettingHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void targetWisselHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void voegToeHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void verwijderHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void startGDBSwoHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void nicenessHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void vindDeviceHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void copySWOHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void freqDimensieHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void kiesDDDHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void startStopDDDHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    virtual void hanWebsiteHandler(wxCommandEvent &event); // wxGlade: <event_handler>
     virtual void converteerBestandHandler(wxCommandEvent &event); // wxGlade: <event_handler>
     virtual void verbindMenuHandler(wxCommandEvent &event); // wxGlade: <event_handler>
    

    // void verbondenAanHandler(wxUpdateUIEvent &);   /* alles dat aan mag tijdens verbinding */
    void connectKnopAktiefHandler(wxUpdateUIEvent &);    /* alles dat uit moet tijdens ontbreken van verbinding */
    void knopMagAanHandler(wxUpdateUIEvent &);    /* alles dat uit moet tijdens verbinding */

    void magDeviceToevoegenHandler(wxUpdateUIEvent &);    /* alles dat uit moet tijdens ontbreken van verbinding */
    void magDeviceVerwijderenHandler(wxUpdateUIEvent &);    /* alles dat uit moet tijdens verbinding */

    //   void opModeDebugAanHandler(wxUpdateUIEvent &);
    // void opModeDebugUitHandler();   /* alles dat uit moet tijdens debuggen */

    // void opModeSWOAanHandler(wxUpdateUIEvent &);
    void connectStandHandler(wxUpdateUIEvent &);
    void debugStandHandler(wxUpdateUIEvent &);
    void dddStandHandler(wxUpdateUIEvent &);

    void debugSWOStandHandler(wxUpdateUIEvent &); /* jlink debug server gerelateerd */
    void swoStandHandler(wxUpdateUIEvent &);      /* alles dat uit moet tijdens SWO view */

    void swdStandHandler(wxUpdateUIEvent &);

    void gdbServerSTDIOHandler(wxUpdateUIEvent &);
    void swoServerSTDIOHandler(wxUpdateUIEvent &);

    void nicenessUpdateHandler(wxUpdateUIEvent &);

    void bestandGekozenHandler(wxFileDirPickerEvent &);
    void gdbInitScriptGekozenHandler(wxFileDirPickerEvent &);

    void onGDBServerProcessTerm(wxProcessEvent &);  /* als de GDB server er mee ophoudt */
    void onDDDProcessTerm(wxProcessEvent &);  /* als DDD er mee ophoudt */
    void onSWOProcessTerm(wxProcessEvent &);  /* als de SWO server er mee ophoudt */

    void gdbSwoSocketHandler(wxSocketEvent &);  /* om socket start op te vangen */
	
    void extProcessTimerPollingEventHandler(wxTimerEvent &);
    void oudBestandLadenHandler(wxCommandEvent &);
}; // wxGlade: end class


class ProgrammeerDropTarget : public wxFileDropTarget
{
public:
    ProgrammeerDropTarget(JLinkVensterKlasse * const );

    wxDragResult OnDragOver(wxCoord ,
                            wxCoord ,
                            wxDragResult );

    bool OnDropFiles(wxCoord ,
                     wxCoord , 
                     const wxArrayString &);

private:
    JLinkVensterKlasse * const ouder;

};

class JLinkProgrammerKlasse : public DesktopApp 
{
public:
    JLinkProgrammerKlasse();

    bool OnInit();

};

DECLARE_APP(JLinkProgrammerKlasse)


#endif // JLinkPROGRAMMER_H